2

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

void calculate(float matrM[][], int origMatr[][]);
4

4 回答 4

5

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

您不能像这样声明“任何大小”的数组,您必须指定除一个以外的所有维度,否则无法计算数组中随机元素的地址。

通常最好将其分解为:

void calculate(float *out, const float *in, size_t width, size_t height);

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

out[y * width + x] = in[y * width + x];
于 2013-05-30T15:02:29.667 回答
5

您的“内部”尺寸必须有尺寸,例如:

void calculate(float matrM[][5], int origMatr[][7]);

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

有关更多详细信息,请参阅在编译时宽度未知时如何编写接受二维数组的函数?来自 C 常见问题解答。

于 2013-05-30T15:02:41.277 回答
4

如果您有一个现代 C 编译器(C99 可以),您可以将“额外”维度作为前面的其他函数参数的表达式

void calculate(size_t n, float matrM[][n], int origMatr[][n]);

你只需要注意你的声明(我给出的那个)和定义(提供函数实现的那个)中有等效的参数。

于 2013-05-30T15:41:40.483 回答
1

当您将数组传递给函数时,您只会获得一个“自由”维度(第一个)。正确的声明看起来更像:

void calculate(float matrM[][N], int origMatr[][M]);
于 2013-05-30T15:03:06.460 回答