Hello All,
I wrote the following code to access a file, assign pointers to the contents of the file, display the file as a matrix, read the last line as a separate matrix, then I am supposed to perform matrix multiplication on the two aforementioned matricies.
I have the first two parts down, but when I try to compute the matrix multiplication y = Ax I get the Segmentation fault (core dump) error.
Here is the contents of matrix5.dat:
7 7
10. 9. 8. 7. 6. 5. 4.
9. 11. -6. 8. 3. -2. 5.
8. -6. 12. 10. -8. -6. 4.
7. 8. 10. 14. 13. -6. 5.
6. 3. -8. 13. 16. 14. -9.
5. -2. -6. -6. 17. 15. 14.
4. 5. 4. 5. -9. 19. 10.
1. 2. -1. 4. -3. 2. 1.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
FILE *infile;
char line[150];
int row, col, rows, cols, i;
double **a, *b, *c;
double dot_p;
infile = fopen("matrix5.dat", "r");
if(infile == NULL){
printf("Error opening matrix5.dat!");
exit(0);
}
fscanf(infile, "%d %d", &rows, &cols);
printf("\n_________________________________\n\n");
printf("There are %d rows and %d columns.\n", rows, cols);
printf("___________________________________\n\n");
a = (double **)calloc((size_t)cols, sizeof(double *));
b = (double *)calloc((size_t)cols, sizeof(double));
c = (double *)calloc((size_t)cols, sizeof(double));
for(row=0;row<rows;row++){
a[row] = (double *)calloc((size_t)cols, sizeof(double));
if(a[row] == NULL){
printf("Error creating row %d!", row);
exit(1);
}
}
printf("a[][]:\n");
for(row=0;row<rows; row++){
for(col=0;col<cols;col++){
fscanf(infile, "%lf", a+col);}
printf("a[%2d] ", row);
for(col=0;col<cols;col++) printf("%9.3f", a[col]);
printf("\n");
}
printf("\n");
printf("b[] ");
do{
do{
for(col=0;col<cols;col++){
fscanf(infile, "%lf", b+col);
printf("%9.3f", b[col]);
}
printf("\n");
}while(row == rows+2);
printf("\n");
for(row=0;row<rows;row++){
for(i=0,dot_p=0.0;i<cols;i++){
dot_p += a[row][i] * b[i];
}
c[row] = dot_p;
}
printf("c[]");
for(row=0;row<rows;row++){
printf("%9.3f", c[row]);
}
printf("\n");
for(row=0;row<rows;row++){
free(a[row]);
}
free(a[col]);
free(b);
free(c);
fclose(infile);
exit(0);
}