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

use*_*468 0 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);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

And*_*rey 6

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


Joh*_*ode 5

请记住,在大多数上下文中,数组表达式将其类型从"N元素数组T"隐式转换("衰减")到"指向T",并计算第一个元素的地址.将CodedGreen(type 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)
Run Code Online (Sandbox Code Playgroud)

请注意,在函数参数声明的上下文中,int *aint a[](无大小)同义,因此int (*code)[Y][Z]也可以写为int code[][Y][Z].我更喜欢使用指针表示法,因为这是函数实际接收的内容,但它们都可以工作.请注意,在您的函数中,您将正常下标:

if (code[row][num][col] == 1)
Run Code Online (Sandbox Code Playgroud)

因为下标运算符隐式取消引用指针(即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 *

表达a,b,b[i],c,c[i],和c[i][j]全阵列表达式,因此它们的类型会衰减到指针类型在大多数情况下.例外情况是数组表达式是sizeof&运算符地址的操作数(如表中所示),或者数组表达式是用于初始化声明中的另一个数组的字符串文字.