我想在另一个函数中移动数组(类型为void),以更改数组的值,但每次我在gcc下都有错误
我有以下规则:
#include <stdio.h>
typedef enum {F=0,T=1} Mat;
//==========================//
void unknown(Mat b[][][]){
b[0][0][0]=7;
printf("%d\n",b[0][0][0]);
}
//=========================//
int main(void){
Mat b[2][2][2];
b[0][0][0]=1;
printf("%d\n",b[0][0][0]); //before the unknown
uknown(b);
printf("%d\n",b[0][0][0]); //after unknown
return 0;
}
我有以下错误:
test.c:7:18:错误:数组类型的元素类型不完整'Mat [] {aka enum []}'void unknown(Mat b [] [] []){ ^ test.c:在函数'main'中:test.c:21:9:错误:形式参数1的类型不完整未知(b); ^
问题是:我需要更改数组的值,而不是在main中,但在函数void unknown中,并检查main(在更改void的未知值数组后) Mat b)如果这个数组通过引用改变这个值,那有什么不对?我需要在代码内部进行哪些更改?
(我的gcc版本:gcc(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609)
答案 0 :(得分:1)
当您将数组传递给函数时,必须指定除第一个之外的所有数组维度;你可以指定第一个维度。
因此:
#include <stdio.h>
typedef enum { F = 0, T = 1 } Mat;
static void unknown(Mat b[][2][2])
{
b[0][0][0] = 7;
printf("%d\n", b[0][0][0]);
}
int main(void)
{
Mat b[2][2][2];
b[0][0][0] = 1;
printf("%d\n", b[0][0][0]);
unknown(b);
printf("%d\n", b[0][0][0]);
return 0;
}
输出:
1
7
7
你也可以写:void unknown(Mat b[2][2][2])
。
在我的默认编译选项下,需要static
来平息编译器警告。由于没有任何其他源文件,因此该函数不需要在此文件外可见,并且可以是static
。或者,我可以在定义函数之前声明函数:extern void unknown(Mat b[][2][2]);
- 这也将满足我使用的选项。 (extern
是可选的,但是我使用它,即使有其他人谴责这种做法;它与在我使用它时在极少数情况下需要声明全局变量的方式是对称的。)我不是&#39 ; t使任何变量或函数在其源文件之外可见,除非有令人信服的理由使其可见 - 即使它是单文件编译也是如此。如果该函数应该在源文件外部可见,则应在头文件中声明,该头文件既可以在定义函数的源文件中使用,也可以在使用该函数的所有源文件中使用。这确保了定义和声明是一致的。