2014-09-24 67 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