2014-09-24 78 views
1

我正在做一個遊戲,我的程序的現有結構是類似下面的...EXTERN,頭,全局變量

prog structure

我遇到的問題是,我有一個函數在init_game.c初始化玩家主板所需的數據,一旦我有這些初始化板我需要the_game.c使用這些初始化板(從init_game.c)。

我對我怎麼能夠讓與extern的工作困惑

編輯:澄清 - 我不知道我怎麼可以使用extern關鍵字與我的程序結構,允許我使用初始化 2D char陣列球員的文件the_game.c

添加下面的圖片澄清我的問題(它獲取的文件init_game.c在初始化,但首先在attributes.h文件中定義)... enter image description here

+0

在'main'全局定義這些變量,並在main中包含'attribute.h'。 – Adarsh 2014-09-24 10:17:58

+0

我不確定你的意思,我的遊戲函數在'the_game.c'中,所以''main'中包含'attributes.h'不會有任何用處。我的問題可能並不清楚,我對如何使用'extern'的方式感到困惑(在一個文件中使用一個初始化變量,在另一個文件中)。 – 2014-09-24 10:21:41

+0

您應該添加一個名爲'globals.c'(它將包含'#include attributes.h')的文件,並在其中放入這些全局變量的實際定義和初始化。 – Medinoc 2014-09-24 10:32:48

回答

0

init_game.c,聲明全局變量,

char player_board[BOARD_SIZE][BOARD_SIZE]; 
char enemy_board[BOARD_SIZE][BOARD_SIZE]; 

包括然後attributes.h將有機會獲得這些陣列的任何文件,提供該文件不具有相同的名稱聲明另一個變量。

在您的main中,在調用使用全局數組的the_game.c中的任何函數之前,您需要確保調用init_game.c的初始化函數。

+0

好的,在'the_game.c'中,我如何訪問數組?就像'player_board [i] [j]'?我對'extern'很困惑。 – 2014-09-24 10:47:14

+1

您可以像訪問任何相同類型的數組一樣訪問它。 'extern'只是通知編譯器該數組是在另一個編譯單元中定義的,在本例中爲'init_game.c'。 – downhillFromHere 2014-09-24 10:50:51

1

這清楚地表明您的程序設計有缺陷。然後正確的解決方案是修復程序設計,而不是用全局變量來實現意大利麪條編碼。

使用它的最好方法是使用面向對象的設計,通過創建「類」或「ADT」或「代碼模塊」(這些東西基本上是指C中的相同事物,因爲沒有class關鍵字) 。每個這樣的類包含一個.h文件和一個.c文件。使用面向對象的概念來保​​持類的自主性,只做他們特定的任務而不關心世界其他地方。使用私有封裝,並把所有在.h文件中被視爲公共的東西。

  • 遊戲是你的項目中的一個類。因此,與該遊戲相關的一切都應該在該類中。
  • 初始化遊戲是絕對與遊戲類相關的,所以代碼應該與game.h合併。將它放在自己的文件中是沒有意義的。
  • 如果其中任何一個文件包含不屬於遊戲類的項目,則需要將這些項目移動到它們自己的文件中。
  • 如果遊戲類證明過於複雜,很可能會出現這種情況,您需要將遊戲的各種屬性拆分爲子類。例如,一個處理委員會的課程,一個處理玩家的課程等等。
  • 如果你的程序設計是正確的,那麼不應該有任何地方的任何全局變量。如果您發現自己使用extern關鍵字,則您的程序設計有缺陷。請注意,靜態文件範圍變量可以很好地使用(儘管考慮線程安全性問題)。
+0

我明白了,當我用C語言編程時,我總是很難分開我的程序。 – 2014-09-24 12:22:46