无效使用带有未指定边界的数组

时间:2010-03-18 12:11:07

标签: c

我的程序中有一个问题。当我将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);
        }

    }

}

2 个答案:

答案 0 :(得分:6)

我会告诉你一个秘密。 2d(和3d)阵列表示为线性存储器阵列。如果您有数组NxM并像a[i][j]那样访问它,它实际上会被翻译为a[i*M + j],因为您可能会注意到编译器必须知道M来执行此转换,否则它将无法翻译它。这就是他所要求的。您必须提供除阵列中的第一个尺寸以外的所有尺寸:int code[][M][N]

答案 1 :(得分:5)

请记住,在大多数情况下,数组表达式将其类型从“N元素数组T”隐式转换(“衰减”)到“指向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或地址 - &运算符的操作数(如表中所示),或者数组表达式是用于初始化另一个数组的字符串文字在声明中。