2015-09-27 240 views
3

因此,我編碼傳統矩陣乘法C(我是一個初學者C),但由於某種原因,我的結果是不正確的,雖然我沒有看到任何眩光錯誤。我的輸入文件看起來像:矩陣乘法結果矩陣中的C - 錯誤值

第一行和第五行中的3 2和2 3表示後續矩陣中的行數和列數。結果應該是一個3x3矩陣,全部爲4s。但是,此代碼返回

-1912599044 32621 572

我傾向於認爲這可能是由於我聲明的方式矩陣。我不使用malloc,而是掃描輸入文件中的行和列值,並直接實例化所需的矩陣。我對C非常陌生,所以動態內存分配的概念還沒有100%清楚。我可能完全不符合標準,但我不確定。尤其讓我困惑的是,大約一半的矩陣返回了正確的值。爲什麼會這樣?以下是我的代碼。

#include<stdio.h> 
#include<stdlib.h> 


int main(int argc, char** argv){ 
    int i, j, k, row1, col1, row2, col2, temp; 
    if(argc != 2){ 
    printf("error\n"); 
    exit(1); 
    } 

    FILE *file = fopen(argv[1], "r"); 
    if(file == NULL){ 
    printf("error\n"); 
    exit(1); 
    } 
    //MATRIX 1 
    fscanf(file, " %d\t%d", &row1, &col1); 
    int matrix1[row1][col1]; 

    for(i = 0; i<row1; i++){ 
    for(j=0; j<col1; j++){ 
     fscanf(file, "%d", &temp); 
     matrix1[i][j] = temp; 
    } 
    } 
    //MATRIX TWO 
    fscanf(file, " %d\t%d", &row2, &col2); 
    int matrix2[row2][col2]; 
    int product[row1][col2]; //DECLARING PRODUCT MATRIX 
    for(i = 0; i<row2; i++){ 
    for(j=0; j<col2; j++){ 
     fscanf(file, "%d", &temp); 
     matrix2[i][j] = temp; 
    } 
    } 

    for(i = 0; i<row1; i++){ 
    for(j = 0; j<col2; j++){ 
     for(k = 0; k<col1; k++){ 
    product[i][j] += matrix1[i][k]*matrix2[k][j]; //MULTIPLICATION STEP 
     } 
    } 
    } 

    for(i = 0; i<row1; i++){ 
    for(j = 0; j<col2; j++){ 
     printf("%d\t", product[i][j]); //PRINTING THE PRODUCT 
    } 
    printf("\n"); 
    } 

    return 0; 
} 
+0

首先,永遠不要使用任何'scanf'derivative(除'sscanf'但只有當你是* 100%確定*輸入格式正確)http://www.gidnetwork.com/b-59.html –

+0

@ hl037_:廢話!如果你知道它的陷阱和行爲,沒有問題。 – Olaf

+0

在這種情況下,我確定輸入格式正確。 @ hl037_ – Sara

回答

3
for(i = 0; i<row1; i++){ 
    for(j = 0; j<col2; j++){ 
     product[i][j] = 0; // should be zero before summing 
     for(k = 0; k<col1; k++){ 
      product[i][j] += matrix1[i][k]*matrix2[k][j]; //MULTIPLICATION STEP 
     } 
    } 
} 
+0

謝謝,有道理。 – Sara

2

你不初始化product,這意味着它的內容是不確定,那麼在計算中使用它(例如與+=)導致未定義行爲

您需要首先將products矩陣初始化爲全零。

1

是的,在C99之前或之後的任何版本中,聲明動態數組的方式並不一定可行,但是造成問題的原因是您沒有初始化product。嘗試calloc(row1*col2, sizeof(int));這種分配所有元素,並將它們初始化爲0

+0

它在C99或C11中工作:https://en.wikipedia.org/wiki/Variable-length_array – Garogolun

+0

它不一定在C11中工作,但這似乎並不是問題在這裏。 – Davislor