Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;错误:数组类型的元素类型不完整;关于函数声明_C_Function - Fatal编程技术网

C &引用;错误:数组类型的元素类型不完整;关于函数声明

C &引用;错误:数组类型的元素类型不完整;关于函数声明,c,function,C,Function,这是函数的声明,编译器在声明和定义中都给出:“error:array type has complete element type”。我看不出有什么错误 void calculate(float matrM[][], int origMatr[][]); C没有非常强大的数组,尤其是在调用函数时。基本上,在运行时发送到函数的唯一数据是第一个元素的地址。这意味着除了最上面的维度外,所有方向的维度都必须是已知的,以便编译器能够生成索引代码。因此,您不能有两个未知维度,这使得索引不可能,因此是不允许

这是函数的声明,编译器在声明和定义中都给出:“error:array type has complete element type”。我看不出有什么错误

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

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

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

通常最好将其分解为:

void calculate(float *out, const float *in, size_t width, size_t height);
这将允许您将任何内存块视为
float
数组,但需要您指定大小,并手动写入索引:

out[y * width + x] = in[y * width + x];
“内部”尺寸必须有一个尺寸,例如:

void calculate(float matrM[][5], int origMatr[][7]);
否则,编译器将不知道如何生成索引代码来访问特定元素。还要注意,这些大小必须是编译时常量表达式

有关更多详细信息,请参阅C常见问题解答。

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

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

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

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

您只需小心,您的声明(我给出的)和定义(提供函数实现的定义)中有等效的参数。

这是一个声明,定义是长的,带有花括号。您需要指定第一个维度大小:
(float matrM[3][],int origMatr[3][])
这是否仅在传递两个数组时才可用?因为30分钟前,我传递了一个没有任何参数和2个整数的数组,它没有给我一个错误。嗯,这取决于,我没有太多地使用C,但我记得一个“结构黑客”通常是为了避免这种分配,并得到某种“自动和自动大小”的分配,但它不是真正定义的行为,它更像是一种未定义的行为,因此采用它并不安全。@Arlind这是在传递数组时发生的。基本上,在运行时发送到函数的唯一信息是第一个元素的地址。声明中必须包含所有其他信息,否则索引将变得不可能。@在C99和VLA参数中,将多维数组作为函数参数进行索引很容易。请看我的答案。
N
M
不需要是常量,从1999年开始。