#include <stdio.h>

typedef struct {
   int **m;
   int filas, columnas;
}matriz;

int **apartarMemoria(f, c)
int f;
int c;
{
   int i,j;
   int **apt;
   apt = (int **)malloc(f*c*sizeof(int));
   for(i=0; i<f; i++){
      apt[i] = (int *)malloc(c*sizeof(int));
   }
   return apt;
}

matriz crearMatriz(int f, int c){
   int i,j;
   matriz k;

   k.filas = f;
   k.columnas = c;
   k.m = apartarMemoria(f,c);
   for(i=0; i<f; i++){
      for(j=0; j<c; j++){
         k.m[i][j] = 0;
      }
   }
   return k;
}

void iniciarMatriz(matriz k, int v){
   int i,j;

   for(i=0; i<k.filas; i++){
      for(j=0; j<k.columnas; j++){
         k.m[i][j] = v;
      }
   }
}

void imprimirMatriz(matriz m){
   int i,j;
   for(i=0; i<m.filas; i++){
      for(j=0; j<m.columnas; j++){
         printf("%i ", m.m[i][j]);
      }
      printf("\n");
   }
}

matriz sumarMatrices(matriz a, matriz b){
   int i,j;
   matriz res;

   res = crearMatriz(a.filas, a.columnas);

   for(i=0; i<a.filas; i++){
      for(j=0; j<a.columnas; j++){
         res.m[i][j] = a.m[i][j] + b.m[i][j];
      }
   }
   return res;
}

int main(int argc, char *argv[]){
   int filas, columnas, i, j;
   matriz m1, m2, r;

   if( argc != 3 ){
      printf("Use summat filas columnas\n");
      exit(0);
   }
   else{
      //Convertir los argumentos a enteros
      filas = atoi(argv[1]);
      columnas = atoi(argv[2]);

      // Crear las matrices
      m1 = crearMatriz(filas, columnas);
      m2 = crearMatriz(filas, columnas);

      // Inicializa las matrices con los valores 2 y 3
      iniciarMatriz(m1, 2);
      iniciarMatriz(m2, 3);

      // sumar matrices y genera la matriz r de resultado
      r = sumarMatrices(m1, m2);

      // Imprimir resultado
      imprimirMatriz(r);
   }
}

