C -如何把结果从内存到文件*.txt



我试图实现一个矩阵乘法程序与2个文件作为参数(mat1.txt和mat2.txt)。我决定将结果加载到一个文件中,但是当我执行程序:./m mat1.txt mat2.txt 20 20 20 20(每个矩阵的文件名和行数和列数)时,我获得和错误:分割错误(核心转储)。问题是文件结果的创建或写入,你能帮助我吗?代码如下:

 /* Memory management */
mem_mat1 = (int *) malloc(M1 * N1 * sizeof(int));
if (mem_mat1 == NULL) {
    fprintf(stderr,"Error: malloc mem_mat1n");
    /*MPI_Finalize();*/
    return (3);
}
mat1 = (int **) malloc(M1 *sizeof(int *));
if (mat1 == NULL) {
    fprintf(stderr,"Error: malloc mat1n");
    /*MPI_Finalize();*/
    return (3);
} 
for (i=0; i<M1; i++) {
    mat1[i] = mem_mat1+(i*N1);
}
mem_mat2 = (int *) malloc(M2 * N2 * sizeof(int));
if (mem_mat2 == NULL) {
    fprintf(stderr,"Error: mem_mat2n");
    /*MPI_Finalize();*/
    return (3);
}
mat2 = (int **) malloc(M2 *sizeof(int *));
if (mat2 == NULL) {
    fprintf(stderr,"Error: malloc mat2n");
    /*MPI_Finalize();*/
    return (3);
} 
for (i=0; i<M2; i++) {
    mat2[i] = mem_mat2+(i*N2);
}
mem_matR = (int *) malloc(M1 * N2 * sizeof(int));
if (mem_matR == NULL) {
    fprintf(stderr,"Error: malloc mem_matRn");
    /*MPI_Finalize();*/
    return (3);
}
matR = (int **) malloc(M1 *sizeof(int *));
if (matR == NULL) {
    fprintf(stderr,"Error: malloc matRn");
    /*MPI_Finalize();*/
    return (3);
}
for (i=0; i<M1; i++) {
    matR[i] = mem_matR+(i*N2);
}
/* SEQUENTIAL PRODUCT MATRIX */
/*Open and Read file 1: mat1.txt*/
fmat1 = fopen(argv[1],"rb");
fread(mat1, M1 *sizeof(int *), N1 *sizeof(int *), fmat1);
/*Open and Read file 2: mat2.txt*/
fmat2 = fopen(argv[2],"rb");
fread(mat2, M2 *sizeof(int *), N2 *sizeof(int *), fmat2);
/*Create a file to write the result fmatR.txt*/
fdR = creat("matR.txt", "w");
if (fdR < 0) {
    fprintf(stderr, "Error create result filen");
    return(2);
}
for (i=0;i<M1;i++) {
    for (j=0;j<N2;j++) {
        sum=0;
        for (k=0;k<N1;k++) {
            sum+=mat1[i][k]*mat2[k][j];
            matR[i][j]=sum;
        }
    }
 }
 write(fdR, &matR, M1*N2 *sizeof(int));

我认为你正在做一些混乱与matR写随机内存…最后一行也是错误的

修复:

1)去掉mem_matR和与之相关的所有代码

2)设matR是指向矩阵(你的缓冲区)的第一个元素的指针,设它是一个简单的M1xN2元素的一维数组

matR = (int *) malloc( M1 * N2 * sizeof(int));

3)在for循环的末尾这样写matR

matR[j+i*N2]=sum;

最后以这种方式保存数据

write(fdR, (void *) matR, M1*N2 *sizeof(int));

,

我也认为read调用是错误的(即使这不会引起问题)

fread(mat1, M1 *sizeof(int *), N1 *sizeof(int *), fmat1);

如果我理解你有一个M1 x N1个整数元素的矩阵。所以…

fread(mat1, sizeof(int *), M1 * N1, fmat1);

同样适用于第二个调用

最新更新