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


typedef struct matriz_int{
    int n_lin; // numero de linhas
    int n_col; // numero de colunas
    int **elementos; // elementos da matriz codificados como um array de ponteiros
} matriz_int_t;



matriz_int_t * criar_matriz_int(int m, int n){

    matriz_int_t * mat = (matriz_int_t*)malloc(sizeof(matriz_int_t));

    mat->n_lin = m;
    mat->n_col = n;

    /* Alocar elementos da matriz de inteiros */

    mat->elementos =  (int**)malloc(m*sizeof(int*));

    for (int i=0;i<m;i++){
        mat->elementos[i] =  (int*)malloc(n*sizeof(int));
    }

    return mat;
}

void destruir_matriz_int(matriz_int_t *mat){

    if(!mat) return;

    /* Desalocar linhas da matriz de inteiros */

    for (int i=0;i<mat->n_lin;i++){
        free(mat->elementos[i]);
    }
    /* Desalocar array de ponteiros para as linhas*/
    free(mat->elementos);

    /* Desalocar o ponteiro para a estrutura*/
    free(mat);

}


void set_matriz_int(matriz_int_t *mat, int i, int j, int valor){
    mat->elementos[i][j] = valor;
}

int get_matriz_int(matriz_int_t *mat, int i, int j){
    return mat->elementos[i][j];
}

void preecher_matriz_inteiros_aleatorios(matriz_int_t * mat){
    time_t t;
    srand((unsigned)time(&t));

    for (int i=0;i<mat->n_lin;i++){
        for (int j=0;j<mat->n_col;j++){
            mat->elementos[i][j] = rand()%10;
        }
    }
}

void imprimir_matriz_int(matriz_int_t *mat){
    for (int i=0;i<mat->n_col;i++)
        printf("---");
    printf("\n");
    for (int i=0;i<mat->n_lin-1;i++){
        for (int j=0;j<mat->n_col;j++){
            printf("%2d ",mat->elementos[i][j]);
        }
        printf("\n");
    }
    for (int i=0;i<mat->n_col;i++)
        printf("---");
    printf("\n");


}

int main()
{
    matriz_int_t *mat_A = criar_matriz_int(10,10);
    matriz_int_t *mat_B = criar_matriz_int(7,8);

    //printf("Endereco de elementos de mat_A: (%d), Dim mat_A: (%d,%d)  \n",mat_A->elementos, mat_A->n_lin,mat_A->n_col);
    //printf("Endereco de elementos de mat_B: (%d), Dim mat_B: (%d,%d)  \n",mat_B->elementos, mat_B->n_lin,mat_B->n_col);

    preecher_matriz_inteiros_aleatorios(mat_A);
    preecher_matriz_inteiros_aleatorios(mat_B);

    imprimir_matriz_int(mat_A);
    imprimir_matriz_int(mat_B);

    destruir_matriz_int(mat_A);
    destruir_matriz_int(mat_B);

    char c;
    scanf("%c",&c);


    return 0;
}
