My program multiplies a matrix 1 by a matrix 2. The matrix 3 is the result.
I can display matrix 1 and matrix 2 with right values but i am not able to display though the same function the right values of matrix 3, although the calculated values are good.
here my code which can compiles.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Dimensions {
int dim1, dim2;
};
struct Dimensions enterDimensions(void);
int **createMatrix(int, int);
void deleteMatrix(int **);
void displayMatrix(int **, int, int);
int **multiply(int ** , int **,int,int,int);
int main(void) {
struct Dimensions dimensions1 = enterDimensions();
int **matrix1 = createMatrix(dimensions1.dim1, dimensions1.dim2);
displayMatrix(matrix1, dimensions1.dim1, dimensions1.dim2);
struct Dimensions dimensions2 = enterDimensions();
int **matrix2 = createMatrix(dimensions2.dim1, dimensions2.dim2);;
displayMatrix(matrix2, dimensions2.dim1, dimensions2.dim2);
if(dimensions1.dim2!=dimensions2.dim1) {
printf("the product of these matrixes does not exist");
} else {
int ** matrix3=multiply(matrix1,matrix2,dimensions1.dim1,dimensions1.dim2,dimensions2.dim2);
displayMatrix(matrix3, dimensions1.dim1,dimensions2.dim2);
deleteMatrix(matrix3);
}
deleteMatrix(matrix1);
deleteMatrix(matrix2);
return 0;
}
struct Dimensions enterDimensions(void) {
int dim1;
int dim2;
struct Dimensions dimensions;
printf("dim 1 : n");
scanf("%d", &dim1);
printf("dim 2 : n");
scanf("%d", &dim2);
dimensions.dim1 = dim1;
dimensions.dim2 = dim2;
return dimensions;
}
int **createMatrix(int dim1, int dim2) {
printf("%s", "ncreate matrixn");
int **matrix = malloc(dim1 * sizeof(int *));
for (int i = 0; i < dim1; i++) {
matrix[i] = malloc(dim2 * sizeof(int));
}
for (int i = 0; i < dim1; i++) {
for (int j = 0; j < dim2; j++) {
printf("enter (%d,%d)n", i, j);
scanf("%d", &matrix[i][j]);
printf("%dn", matrix[i][j]);
}
}
return matrix;
}
void deleteMatrix(int **matrix) {
printf("%s", "ndelete matrixn");
free(matrix); // /! Warning : Parameter 'matrix' may point to deallocated memory when called from function 'main'
}
void displayMatrix(int **matrix, int dim1, int dim2) {
if (matrix == NULL) {
exit(1);
}
for (int i = 0; i < dim1; i++) {
for (int j = 0; j < dim2; j++) {
if (j == dim2 - 1) {
printf("[%d]n", matrix[i][j]);
} else {
printf("[%d]", matrix[i][j]);
}
}
}
}
int **multiply(int ** matrix1, int ** matrix2, int dim11, int dim12, int dim22) {
int **matrix3=malloc(dim11*sizeof(int));
for(int i=0;i<dim11;i++) {
for(int j=0;j<dim22;j++) {
int cij=0;
for(int k=0;k<dim12;k++) {
if(matrix1==NULL || matrix2==NULL) {
exit(3);
}
cij+=matrix1[i][k]*matrix2[k][j];
}
for(int l=0;l<dim11;l++) {
matrix3[l]=malloc(dim22*sizeof(int));
}
matrix3[i][j]=cij;
printf("cij : %dn",matrix3[i][j]);
}
}
return matrix3;
};
Here an output :
dim 1 :
2
dim 2 :
2
create matrix
enter (0,0)
1
1
enter (0,1)
0
0
enter (1,0)
0
0
enter (1,1)
1
1
[1][0]
[0][1]
dim 1 :
2
dim 2 :
2
create matrix
enter (0,0)
3
3
enter (0,1)
3
3
enter (1,0)
3
3
enter (1,1)
3
3
[3][3]
[3][3]
cij : 3
cij : 3
cij : 3
cij : 3
[-253143104][428]
[-253143104][3]
delete matrix
delete matrix
delete matrix
Process finished with exit code 0
[-253143104][428]
[-253143104][3]
Here is the wrong result.
To your mind, what is the issue ?
Thanks a lot.
PS : if you have some ideas for improving my code, don’t hesitate to tell me because I am a beginner.