#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAT_SIZE 500
#ifndef TIPO_VAR
#define TIPO_VAR double
#endif
#define PUNTATORI
//#define SCRIVI_INDICI

#ifndef PUNTATORI

  TIPO_VAR Mat1[MAT_SIZE][MAT_SIZE],
		   Mat2[MAT_SIZE][MAT_SIZE],
		   MatRes[MAT_SIZE][MAT_SIZE];
#endif

int main (void)
{
  long r1,rr,rc;
  clock_t start,end;


#ifdef PUNTATORI

  TIPO_VAR *Mat1,*Mat2,*MatRes;

  if((Mat1=(TIPO_VAR *)calloc(MAT_SIZE*MAT_SIZE,sizeof(TIPO_VAR)))==NULL)
	return 0;
  if((Mat2=(TIPO_VAR *)calloc(MAT_SIZE*MAT_SIZE,sizeof(TIPO_VAR)))==NULL)
	return 0;
  if((MatRes=(TIPO_VAR *)calloc(MAT_SIZE*MAT_SIZE,sizeof(TIPO_VAR)))==NULL)
	return 0;

  for(rr=0;rr<MAT_SIZE;rr++)
	for(rc=0;rc<MAT_SIZE;rc++)
	{
	  *(TIPO_VAR *)(Mat1+rc+rr*MAT_SIZE)=(-MAT_SIZE/2+rr+rc)/2.5;
	  *(TIPO_VAR *)(Mat2+rc+rr*MAT_SIZE)=(-MAT_SIZE/4+rr+rc)*5.5;
	}

	start = clock();

	for(rr=0;rr<MAT_SIZE;rr++)
	  for(rc=0;rc<MAT_SIZE;rc++)
	  {

  #ifdef SCRIVI_INDICI

		printf("[%d,%d]\n",rc,rr);

  #endif

		for(r1=0;r1<MAT_SIZE;r1++)
		  *(TIPO_VAR *)(MatRes+rc+rr*MAT_SIZE)+=
		  *(TIPO_VAR *)(Mat1+r1+rr*MAT_SIZE)*
		  *(TIPO_VAR *)(Mat2+rr+r1*MAT_SIZE);
	  }

#else

	printf ("Please wait, running test (may take several minutes)...\n");

	for(rr=0;rr<MAT_SIZE;rr++)
	  for(rc=0;rc<MAT_SIZE;rc++)
	  {
		Mat1[rr][rc]=(-MAT_SIZE/2+rr+rc)/2.5;
		Mat2[rr][rc]=(-MAT_SIZE/4+rr+rc)*5.5;
	  }

	start = clock();

	for(rr=0;rr<MAT_SIZE;rr++)
	  for(rc=0;rc<MAT_SIZE;rc++)
	  {

  #ifdef SCRIVI_INDICI

		printf("[%d,%d]\n",rc,rr);

  #endif

		for(r1=0;r1<MAT_SIZE;r1++)
		  MatRes[rr][rc]+=(Mat1[rr][r1]*Mat2[r1][rr]);
	   }

#endif

	end = clock();

#ifdef PUNTATORI

	free(MatRes);
	free(Mat2);
	free(Mat1);

#endif

	printf("Processor time used = %f\n", ((double)(end - start))/CLOCKS_PER_SEC);

	return 0;
}
