2016-12-29 168 views
0

我想搬到另一个函数(类型为void)数组,改变数组的值移动的typedef枚举阵列,但每个时代我有在海湾合作委员会的错误在另一个函数

我有那些以下规则:

    在这个练习中它是被禁止使用全局变量
  1. 我们希望通过参照阵列移动,而不是使用指针:

#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: error: array type has incomplete element type ‘Mat[] {aka enum []}’ void unknown(Mat b[][][]){ ^test.c: In function ‘main’: test.c:21:9: error: type of formal parameter 1 is incomplete unknown(b); ^

的问题是:我需要改变阵列的价值不是主力,但在函数void未知,并检查主要(在改变void Mat未知值的数组Mat)后,如果这个数组通过引用改变这个值,怎么了?在代码中需要更改什么?

(我的gcc版本:GCC(Ubuntu的5.4.0-6ubuntu1〜16.04.4)5.4.0 20160609)

+2

在未知函数中,您必须指定最后两个维度,并可以指定第一个维度。 '垫子b [] [2] [2]'。 –

+2

关于你的规则#2,在C中没有参考的概念。在这种情况下,你正在有效地传递指针。你可以查询“阵列衰减”以获取更多信息。这个答案阐述更多http://stackoverflow.com/questions/1461432/what-is-array-decaying#1461449 – diametralpitch

+0

就这样你知道'b [2] [2] [2]'和'b [8]'是当你将它们传递给函数时,数组会衰减成指针,所以'Mat b [8];''和'void unknown(Mat * b)'可能会让你的代码更容易阅读 –

回答

0

当你通过数组的函数,则必须指定除第一个所有阵列尺寸;你可以指定第一个维度。

这样:

#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是可选的,但我使用它,即使有其他人对这种做法非常感兴趣;它与我在使用一种罕见情况时需要声明全局变量的方式是对称的。)我不做任何变量或函数在其源文件外部可见,除非有令人信服的理由使其可见 - 即使是单个文件编译。如果函数应该在源文件之外可见,则应该在用于定义函数的源文件和使用该函数的所有源文件中使用的标头中声明该函数。这确保了定义和声明是一致的。