我的程序中有一个问题.当我将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)
我会告诉你一个秘密.2d(和3d)阵列表示为线性存储器阵列.当你有数组NxM并访问它就像a[i][j]它实际上被翻译a[i*M + j]成你可能会注意到编译器必须知道M在这里做这个转换,否则它将无法翻译它.这就是他所要求的.您必须提供除阵列中的第一个尺寸以外的所int code[][M][N]
请记住,在大多数上下文中,数组表达式将其类型从"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 *a与int 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或&运算符地址的操作数(如表中所示),或者数组表达式是用于初始化声明中的另一个数组的字符串文字.