2010-03-18 77 views
0

我在程序中遇到了問題。當我將3D int數組CodedGreen傳遞給函數Green_Decode_Tree時。顯示錯誤消息「無效使用未指定邊界的數組」。我的程序中有什麼錯誤?謝謝你的幫助。無法使用未指定邊界的數組

for(i=0;i<256;i++){ 
      for(j=0;j<256;j++){ 
    Decode_Tree(green[0], CodedGreen,0,i,j); 
      } 
     } 

void Green_Decode_Tree(node* tree, int code[][][], int num,int row,int col) 
{ 
    int i; 
    i=num; 

    if((tree->left == NULL) && (tree->right == NULL)){ 
     fprintf(DecodGreen,"%s\n", tree->ch); 
    } 
    else 
    { 
     if(code[row][col][num]==1){ 
      i++; 
      Green_Decode_Tree(tree->left,code,i,row,col); 
     } 
     else if (code[row][col][num]==0){ 
      i++; 
      Green_Decode_Tree(tree->right,code,i,row,col); 
     } 

    } 

} 
+0

看到這個:http://stackoverflow.com/questions/4051/passing-multidimensional-arrays-as-function-arguments-in-c,特別是http://www.eskimo.com/~scs/ cclass/INT/sx9a.html – 2010-03-18 12:18:39

回答

3

我會告訴你一個祕密。 2d(和3d)數組表示爲線性存儲器陣列。當你有數組NxM並且像a[i][j]那樣訪問它時,它實際上被翻譯爲a[i*M + j],因爲你可能會注意到編譯器必須知道M在這裏做這個轉換,否則它將不能翻譯它。這就是他所要求的。你必須提供所有除了在陣列的第一尺寸:int code[][M][N]

5

請記住,在大多數情況下,數組表達式具有它們的類型隱含地從「T的N元件陣列」轉換(「衰變」),以「指針T」和評估到第一個元素的地址。當您將CodedGreen(類型int [X][Y][Z])傳遞給Green_Decode_Tree時,該函數接收的是類型爲int (*)[Y][Z]的指針值。

所以你的原型Green_Decode_Tree必須

void Green_Decode_Tree(node *tree, int (*code)[Y][Z], int num, int row, int col) 

注意,在函數參數聲明的情況下,int *aint a[](大小)的代名詞,所以int (*code)[Y][Z]也可以寫成int code[][Y][Z]。我更喜歡使用指針表示法,因爲這是函數實際接收的內容,但是兩者都可以工作。請注意,在你的功能,你會是下標爲正常:

if (code[row][num][col] == 1) 

因爲下標運算符隱含解引用指針(即code[row] == *(code+row))。

這可能是有益的:

 
Declaration   Expression  Type   Decays to 
-----------   ----------  ----   --------- 
T a[X];      a  T [X]   T * 
          &a  T (*)[X] 

T b[X][Y];     b  T [X][Y]  T (*)[Y] 
          &b  T (*)[X][Y] 
          b[i]  T [Y]   T * 
         &b[i]  T (*)[Y] 

T c[X][Y][Z];    c  T [X][Y][Z]  T (*)[Y][Z] 
          &c  T (*)[X][Y][Z] 
          c[i]  T [Y][Z]  T (*)[Z] 
         &c[i]  T (*)[Y][Z] 
         c[i][j]  T [Z]   T * 

表達abb[i]cc[i],並且c[i][j]都是數組表達式,因此它們的類型會衰減到指針類型在大多數情況下。當數組表達式是sizeof&運算符(如表中所示)的操作數時,或者當數組表達式是用於在聲明中初始化另一個數組的字符串文本時,例外情況是例外。