【发布时间】:2017-05-14 00:34:28
【问题描述】:
我想将数组移动到另一个函数(类型为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 枚举 []}' void unknown(Mat b[][][]){ ^ test.c:在函数'main'中:test.c:21:9:错误:形式参数1的类型不完整未知(b); ^
问题是:我需要更改数组的值,不是在 main 中,而是在函数 void unknown 中,并在 main 中检查(在数组的 void unknown 值发生变化之后Mat b)如果这个数组通过引用改变了这个值,有什么问题?我需要在代码中更改什么?
(我的gcc版本:gcc(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609)
【问题讨论】:
-
未知函数中,必须指定最后两个维度,可以指定第一个。
Mat b[][2][2]. -
关于您的规则 #2,在 C 中没有引用的概念。在这种情况下,您实际上是通过指针传递。您可以查找“数组衰减”以获取更多信息。这个答案详细说明了stackoverflow.com/questions/1461432/…
-
您知道
b[2][2][2]和b[8]在这里可以互换,当您将数组传递给函数时,它们会衰减为指针,因此Mat b[8];和void unknown(Mat *b)可能会使您的代码更易于阅读 -
@EliasVanOotegem:我看不出
b[2][2][2]和b[8]是如何等效的。第一个需要三个下标来找到基础值;第二个只需要一个下标。至少,你已经过分简化了你想说的话。在最坏的情况下,你完全错了。
标签: c gcc multidimensional-array typedef