//Programa de multiplicacao de 2 matrizes (A e B), gerando o resultado em uma matriz C
//Aloquei a matriz, a retornei via funcao e depois chamei desaloquei(free),
//de acordo com o raciocinio falado aqui no site. porém recebo 'segmentation fault'.
//alguém pode me ajudar?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
float **multiplicaMatriz(int linA, int colA, int linB, int colB);
void desalocaMatriz(float **C, int nlinhas);
int main(void)
{
int linA, colA, linB, colB;
float **C;
int i;
int j;
printf("\n\nInforme o numero de linhas para a matriz A = ");
scanf("%d", &linA);
printf("\nInforme o numero de colunas para a matriz A = ");
scanf("%d", &colA);
printf("\nInforme o numero de linhas para a matriz B = ");
scanf("%d", &linB);
printf("\nInforme o numero de colunas para a matriz B = ");
scanf("%d", &colB);
if(colA != linB)
{
printf("\n\nATENCAO: O produto das matrizes informadas não eh possível!\n");
printf("Isso acontece pois o numero de colunas da matriz A eh diferente do numero de linhas da matriz B.\n\n");
exit(0);
}
C = multiplicaMatriz(linA, colA, linB, colB);
for(i = 0; i < linA; i++)
{
for(j = 0; j < colB; j++)
{
printf("%f\n", C[i][j]);
}
}
desalocaMatriz(C, linA);
return 0;
}
float **multiplicaMatriz(int linA, int colA, int linB, int colB)
{
int i;
int x, y, a1, a2;
float temp;
float A[linA][colA];
float B[linB][colB];
// float C[linA][colB];
float **C = (float **) malloc(sizeof(float *) * linA);
// Gera matriz A
printf("\n GERANDO MATRIZ A \n\n");
for(x = 0;x < linA; x++)
{
for(y = 0;y < colA; y++)
{
printf("A[%d][%d] = ", x+1,y+1);
A[x][y] = rand() % 15;
}
}
// Gera matriz B
printf("\n GERANDO MATRIZ B \n");
for(x = 0;x < linB; x++)
{
for(y = 0;y < colB; y++)
{
printf("B[%d][%d] = ", x+1,y+1);
//scanf("%f", &B[x][y]);
B[x][y] = rand() % 15;
}
}
// Imprime matriz A
printf("\n MATRIZ A \n\n");
for(x = 0; x < linA; x++)
{
for(y = 0; y < linA; y++)
{
if(y !=(colA - 1))
printf("|%.2f \n", A[x][y]);
else
printf("|%.2f \n", A[x][y]);
}
}
printf("\n\n");
// Imprime matriz B
printf("\n MATRIZ B \n\n");
for(x = 0; x < linB; x++)
{
for(y = 0; y < linB; y++)
{
if(y !=(colB - 1))
printf("|%.2f \n", B[x][y]);
else
printf("|%.2f \n", B[x][y]);
}
}
for(a1 = 0; a1 < linA; a1++)
{
for(a2 = 0; a2 < colB; a2++)
{
temp=0.0;
for(x = 0; x < colA; x++)
{
temp = temp+A[a1][x]*B[x][a2];
}
C[a1][a2] = temp;
}
}
printf("\n \n");
printf("\n MATRIZ C = A x B \n \n");
for(x = 0; x < linA; x++)
{
for(y = 0; y < colB; y++)
{
if(y!=(colB-1))
{
printf("%.2f \t",C[x][y]);
}
else
{
printf("%.2f \n",C[x][y]);
}
}
}
/* Aloca matriz C */
printf("Alocando matriz C");
for(i = 0; i < linA; i++)
{
C[i] = (float *) malloc(sizeof(float) * colB);
}
return C;
}
void desalocaMatriz(float **C, int nlinhas)
{
int i;
for(i = 0; i < nlinhas; i++)
{
free(C[i]);
}
}