我的程序中有一个问题。当我将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 :(得分: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 *a
与int 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 *
表达式a
,b
,b[i]
,c
,c[i]
和c[i][j]
都是数组表达式,因此它们的类型将会在大多数情况下衰减到指针类型。例外情况是数组表达式是sizeof
或地址 - &
运算符的操作数(如表中所示),或者数组表达式是用于初始化另一个数组的字符串文字在声明中。