函数声明中的"错误:数组类型具有不完整的元素类型"

Arl*_*ind 2 c function

这是函数的声明,编译器在声明和定义中给出:"错误:数组类型具有不完整的元素类型".我没有看到错误.

void calculate(float matrM[][], int origMatr[][]);
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 5

C没有非常强大的数组,尤其是在调用函数时.基本上,在运行时发送给函数的唯一数据是第一个元素的地址.这意味着必须在除最顶层之外的所有方向上知道维度,以便编译器能够生成索引代码.因此,您不能有两个未知的维度,这使得索引不可能,因此是不允许的.

你不能声明这样的"任何大小"数组,你必须指定除一个之外的所有维度,否则无法计算数组中随机元素的地址.

通常最好将其分解为:

void calculate(float *out, const float *in, size_t width, size_t height);
Run Code Online (Sandbox Code Playgroud)

这将允许您将任何内存块视为float数组,但需要您指定大小,并手动编写索引:

out[y * width + x] = in[y * width + x];
Run Code Online (Sandbox Code Playgroud)


Oli*_*rth 5

您的"内部"尺寸必须具有尺寸,例如:

void calculate(float matrM[][5], int origMatr[][7]);
Run Code Online (Sandbox Code Playgroud)

否则,编译器将不知道如何生成索引代码以访问特定元素.另请注意,这些大小必须是编译时常量表达式.

有关更多详细信息,请参阅如何在编译时未知宽度时编写接受二维数组的函数?来自C FAQ.