2013-01-02 83 views
-1

我試圖用2個文件作爲參數(mat1.txt和mat2.txt)來實現一個矩陣乘法程序。我決定將結果加載到一個文件中,但是當我執行程序時:./m mat1.txt mat2.txt 20 20 20 20(文件名和每個矩陣的行數和列數),我得到並顯示錯誤:Segmentation fault (核心傾倒)。 問題是文件結果的創建或寫入,你能幫我嗎? 代碼如下介紹:如何把內存的結果放到一個文件中* .txt

/* Memory management */ 
mem_mat1 = (int *) malloc(M1 * N1 * sizeof(int)); 
if (mem_mat1 == NULL) { 
    fprintf(stderr,"Error: malloc mem_mat1\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

mat1 = (int **) malloc(M1 *sizeof(int *)); 
if (mat1 == NULL) { 
    fprintf(stderr,"Error: malloc mat1\n"); 
    /*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_mat2\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

mat2 = (int **) malloc(M2 *sizeof(int *)); 
if (mat2 == NULL) { 
    fprintf(stderr,"Error: malloc mat2\n"); 
    /*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_matR\n"); 
    /*MPI_Finalize();*/ 
    return (3); 
} 

matR = (int **) malloc(M1 *sizeof(int *)); 
if (matR == NULL) { 
    fprintf(stderr,"Error: malloc matR\n"); 
    /*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 file\n"); 
    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)); 
+0

哪裏賽格故障?你採取了哪些措施來縮小或隔離它? – abelenky

+0

首先,從'malloc()'中刪除cast .. – Jack

+2

歡迎來到SO。 [請閱讀常見問題](http://stackoverflow.com/faq)。這不是一個調試服務。如果你想調試,使用調試器。 – netcoder

回答

1

我認爲你正在做一些混亂與線粒體matR寫入隨機存儲...也是最後一行是錯誤的。

修正:

1)拿走mem_matR和所有與其相關的

2)的代碼讓線粒體matR是指向矩陣的第一個元素(您的緩衝液),並讓它是M1xN2元件

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

3)在for循環在端部的簡單的一維數組寫線粒體matR這樣

matR[j+i*N2]=sum; 

4)最後這種方式保存數據

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

-

也是我認爲FREAD調用是錯誤的(即使這不會導致問題)

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

如果我明白你有一個整數的M1×N1元素的矩陣。所以......

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

同樣適用於塞康呼叫

+0

+1爲您的鏟子... – Potatoswatter

相關問題