我想在另一个函数中移动数组(键入void),以更改数组的值,但是每次我在gcc
下都有错误我有以下规则:
- 在本练习中,禁止使用全局变量,
- 我们想通过参考移动数组,而不是使用指针:
。
#include <stdio.h>
typedef enum {F=0,T=1} Mat;
//==========================//
void unknown(Mat b[][][]){
b[0][0][0]=7;
printf("%dn",b[0][0][0]);
}
//=========================//
int main(void){
Mat b[2][2][2];
b[0][0][0]=1;
printf("%dn",b[0][0][0]); //before the unknown
uknown(b);
printf("%dn",b[0][0][0]); //after unknown
return 0;
}
我有以下错误:
test.c:7:18:错误:数组类型的元素类型不完整 enum []}’void unknown(mat b [] [] []){ ^ test.c:在函数" main"中:test.c:21:9:错误:正式参数1的类型是不完整的未知(b); ^
问题是:我需要更改数组的值,而不是主要的,而是在函数中毫无疑问,然后检查MAIN(在更改阵列的无知值之后垫子b)如果此数组通过引用更改此值,怎么了?我需要在代码内更改什么?
(我的GCC版本:GCC(Ubuntu 5.4.0-6ubuntu1〜16.04.4)5.4.0 20160609)
您必须指定所有数组尺寸,除非将数组传递到函数时第一个;您可以指定第一个维度。
因此:
#include <stdio.h>
typedef enum { F = 0, T = 1 } Mat;
static void unknown(Mat b[][2][2])
{
b[0][0][0] = 7;
printf("%dn", b[0][0][0]);
}
int main(void)
{
Mat b[2][2][2];
b[0][0][0] = 1;
printf("%dn", b[0][0][0]);
unknown(b);
printf("%dn", 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
是可选的,但是我使用它,即使有些其他人擅长练习;当我使用一个时,在极少数情况下需要声明全局变量是对称的。)我不做任何变量或任何变量除非有令人信服的理由可以看到其源文件之外的功能,否则即使是单个文件汇编,也不会可见。如果该函数应在源文件之外可见,则应在定义函数的源文件和使用该函数的所有源文件中使用的标题中声明。这确保了定义和声明是一致的。