我知道有类似的问题,但即使我已经阅读了2个小时,我仍然无法弄清楚这一点。
struct box
{
char letter;
int occupied; //0 false, 1 true.
};
void fill(struct box**, int, int, char*); //ERROR HERE**
int main(int argc, char** argv)
{
int length=atoi(argv[4]),
width=atoi(argv[5]),
char alphabet[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
struct box soup[length][width];
fill(soup, length, width, alphabet); //HERE**
}
void fill(struct box soup[][], int length, int width, char*alphabet) //AND HERE**
{
//omitted
}
这些是我编译时遇到的错误:
warning: passing argument 1 of ‘fill’ from incompatible pointer type [enabled by default]
fill(soup, length, width, alphabet);
^
note: expected ‘struct box **’ but argument is of type ‘struct box (*)[(sizetype)(width)]’
void fill(struct box **, int, int, char*);
^
error: array type has incomplete element type
void fill(struct box soup[][], int length, int width, char*alphabet)
^
我不明白为什么失败了,而我喜欢这个的其他一些功能确实有效:
void wordsToMemory(char**, char*); //prototype
char* dictionary[Nwords];
wordsToMemory(dictionary, argv[1]); //calling the method
void wordsToMemory(char* dictionary[], char* argv) //function body
{
//omitted
}
答案 0 :(得分:0)
这将使其编译:
void fill(struct box** soup, int length, int width, char* alphabet)
或
void fill(struct box* soup[], int length, int width, char* alphabet)
使用[][]
时,您会收到错误消息,因为struct box*
无法转换为struct box
。
答案 1 :(得分:0)
Array decays into pointers.
当您将单维数组传递给函数时,接收数组的函数可能如下所示
void fun(char a[10]) void fun(char a[]) void fun(char *a)
{ { {
... OR ... OR ...
} } }
Arrays decays into pointer, not always true
...数组衰减成指针不是递归应用的......意思是,2D
数组衰减到pointer to array
而不是pointer to pointer
所以这就是为什么你是得到错误。
当您将2D
数组传递给函数时,接收2D
数组的函数应该如下所示......
void fun(char *a[10])
{
...
}
答案 2 :(得分:0)
void fill(struct box**, int, int, char*);
这个声明是错误的,因为它声明函数的第一个参数必须是指向struct box
指针的类型,而你没有指向struct box
中指向main
的指针,而不是你所说的结构的矩阵(二维数组,数组数组)。
所以,原型
void fill(struct box [][], int, int, char *);
几乎是正确的,除了,只能省略矩阵声明的主要(第一)维度,所以我们需要在其中至少指定width
,这也方便地传递给函数,参数'必须更改订单,以便尽早定义width
:
void fill(int length, int width, struct box soup[][width], char *alphabet);
main
中的函数调用因此:
fill(length, width, soup, alphabet);