2012-10-16 92 views
0

我正在研究C/C++中的指針,並且作爲我的小項目來學習這個問題,我正在嘗試開發一個簡單的應用程序,使用矩陣運算。我想問一下,如果我使用指針和動態分配的方式是正確的,或者我錯了。謝謝:)我的指針和動態分配的實現是否正確?

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

int numberRows; 
int numberCollumns; 
void getSize() 
{ 
    printf("Write down size of matrix in format Rows Collumns: "); 
    scanf("%i %i", &numberRows, &numberCollumns); 
} 

void getMatrix(int *m[]) 
{ 
    int x = 0; 
    int y = 0; 
    while(x<numberRows) 
    { 
     while(y<numberCollumns) 
     { 
     scanf("%i", &m[x][y]); 
     y++;   
     } 
    x++; 
    y = 0; 
    } 
} 

void writeMatrix(int *m[]) 
{ 
    int x = 0; 
    int y = 0; 
    while(x<numberRows) 
    { 
     while(y<numberCollumns) 
     { 
     printf("%i ", m[x][y]); 
     y++;   
     } 
    printf("\n"); 
    x++; 
    y = 0; 
    } 
} 

int main() 
{ 
    getSize(); 
    int **matrix; 
    matrix = (int**)malloc(numberRows*sizeof(int*)); 
    int x = 0; 
    while(x < numberCollumns) 
    { 
     matrix[x] = (int*)malloc(numberCollumns*sizeof(int)); 
     x++; 
    } 
    getMatrix(matrix); 
    printf("\n\nMatrix: \n"); 
    writeMatrix(matrix); 


    return 0; 
} 
+3

這是C風格的代碼,而不是C++。 C/C++不是一種語言,請選擇其中一種。 – GManNickG

+0

你測試了這個代碼嗎?它是否按照您的預期行事? – Beta

+1

可能對codereview網站更好。 – Joe

回答

0

我發現一個問題:

​​3210

你的循環條件是錯誤的。如果行數和列數不匹配怎麼辦? 此外,我沒有看到任何相應的電話free

至於代碼風格,你的while循環看起來for循環更好:

for(int x = 0; x < numberRows; ++x) 
{ 
    matrix[x] = (int*)malloc(numberCollumns*sizeof(int)); 
} 

旁註

的代碼是純C(以及除了從malloc迴歸的鑄造)。 C++代碼看起來很不一樣。

0

它看起來不錯,但傑西好指出,你的建設要遍歷numberRows,不numberCollumnsPS只有一個L的「列」)。

我認爲你有一個令人誤解的變量名稱選擇。您的矩陣佈局爲matrix[rows][columns],但您使用[x][y]對其進行索引。傳統上,x是一個水平索引,而y是垂直的。使用x選擇行(這是一個垂直維度)有一天會讓你困惑。要麼反過來使用這些,要麼做數學家的工作(使用ij)。

關於2D矩陣本身,由於緩存局部性和效率的原因,我會避免爲每一行分配單獨的內存。我有一天回答了一個問題,並提供了一些想法:Using pointers instead of an array

最後,這只是一個普通的風格的東西......當你迭代你的行/列時,爲什麼不使用for循環。閱讀起來要容易得多,而且不太容易發生事故(「哎呦,我忘了重置和/或增加我的計數器」)。

噢,是的,如果這是純粹的C,不要投你的malloc調用的結果。