2016-12-29 167 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是可選的,但我使用它,即使有其他人對這種做法非常感興趣;它與我在使用一種罕見情況時需要聲明全局變量的方式是對稱的。)我不做任何變量或函數在其源文件外部可見,除非有令人信服的理由使其可見 - 即使是單個文件編譯。如果函數應該在源文件之外可見,則應該在用於定義函數的源文件和使用該函數的所有源文件中使用的標頭中聲明該函數。這確保了定義和聲明是一致的。