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


#define MAT_SIZE 500
#define TIPO_VAR double
#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

    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 = %d\n", (end - start)/CLOCKS_PER_SEC);

    return 0;
}
