2010-03-18 75 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&运算符(如表中所示)的操作数时,或者当数组表达式是用于在声明中初始化另一个数组的字符串文本时,例外情况是例外。