这是函数的声明,编译器在声明和定义中给出:“错误:数组类型具有不完整的元素类型”。我没有看到错误。
void calculate(float matrM[][], int origMatr[][]);
答案 0 :(得分:5)
C没有非常强大的数组,特别是在调用函数时没有。基本上,在运行时发送给函数的唯一数据是第一个元素的地址。这意味着必须在除最顶层之外的所有方向上知道维度,以便编译器能够生成索引代码。因此,你不能有两个未知的维度,这使得索引不可能,因此是不允许的。
你不能声明这样的“任何大小”数组,你必须指定除一个之外的所有维度,否则就无法计算数组中随机元素的地址。
通常最好将其分解为:
void calculate(float *out, const float *in, size_t width, size_t height);
这将允许您将任何内存块视为float
数组,但需要您指定大小,并手动编写索引:
out[y * width + x] = in[y * width + x];
答案 1 :(得分:5)
您的“内部”尺寸必须具有尺寸,例如:
void calculate(float matrM[][5], int origMatr[][7]);
否则,编译器将不知道如何生成索引代码以访问特定元素。另请注意,这些大小必须是编译时常量表达式。
有关详情,请参阅C FAQ中的How do I write functions which accept two-dimensional arrays when the width is not known at compile time?。
答案 2 :(得分:4)
如果您有一个现代的C编译器(C99会这样做),您可以将“额外”维度作为其他函数参数的表达式
void calculate(size_t n, float matrM[][n], int origMatr[][n]);
你必须要小心你的声明(我给出的那个)和定义(提供函数实现的那个)中有相同的参数。
答案 3 :(得分:1)
你只得到一个"免费"当您将数组传递给函数时,维度(第一个)。正确的声明看起来更像是:
void calculate(float matrM[][N], int origMatr[][M]);