2014-03-31 98 views
0

我已經下載了代碼,它看起來是正確的(和運行):此代碼是如何正確的?

int (*oldMatrix)[NJ] = new int[NI][NJ]; 
int (*newMatrix)[NJ] = new int[NI][NJ]; 

/* initialize elements of old to 0 or 1 */ 
for (i=1; i<=NI; i++) { 
    for (j=1; j<=NJ; j++) { 
     x = rand()/((float)RAND_MAX + 1); 
     if(x<0.5) { 
      oldMatrix[i][j] = 0; 
     } else { 
      oldMatrix[i][j] = 1; 
     } 
    } 
} 

什麼我不明白:爲什麼oldMatrix和大小NI的newMatrix,而不是大小NJ的?

+3

您使用哪種語言? – summea

+1

C++。我認爲代碼的創建者犯了一個錯誤,我們不應該只寫int ** oldMatrix = new int [NI] [NJ]; int ** newMatrix = new int [NI] [NJ]; ? – user3346223

+0

還有一個嚴重錯誤:C++中的數組索引是從零開始的。對於大小爲「NI」的數組,訪問元素「NI」肯定是一個錯誤。 (爲了比較,只要'NI> = 1',訪問'NI-1'就不會有問題。) – rwong

回答

2
int (*oldMatrix)[NJ] = new int[NI][NJ]; 

[NJ]沒有宣佈它的長度在那裏,而是其類型聲明的一部分。 oldMatrix是指向長度爲NJ的數組的指針,該數組被設置爲指向長度爲NI數組的動態數組。

這相當於

typedef int row_type[NJ]; 
row_type *oldMatrix = new row_type[NI]; 

編輯:測試

+0

好的,謝謝。我來自C,其中這種表示法表示oldMatrix的大小是NJ,而不是NI ... – user3346223

+1

@ user3346223所討論的代碼比C++更像C。製作矩陣的最好方法是使用'std :: vector'和一個索引函數'I(i,j)= i * NJ + j'。試圖強化'[i] [j]'語法會導致太多併發症。 – Cramer

+0

這個符號與C相同,也許你誤解了C版本。試試C'int x [NI] [NJ]; int(* p)[NJ] = x; '。如果您將'NJ'更改爲'NI',您將收到編譯錯誤。 –

1

由於NI表示沒有行和NJ表示沒有列。

    NJ 
      a1 a2 a3 a4 
NI  b1 b2 b3 b4 
      c1 c2 c4 c4 
      d1 d2 d3 d4