如何使函数永久更改全局数组

时间:2015-08-23 01:05:23

标签: c++ arrays global

最近,我一直致力于基于文本的游戏的库存系统,该游戏使用全局数组作为库存系统,并使用相应的函数在所述数组中读取真或假。我遇到的问题是,我用来修改数组的函数

void playerGet(bool items[], int itemNumber) //this function takes an assigned argument of the array indices variable, and changes that array indices from true, to false. 
{
    items[itemNumber] = true;
}

仅修改其所在函数范围内的数组。数组在.cpp文件中定义,如下所示:

void inventoryArray(bool items[]) //This function establishes all the items in the game, the true false statement expresses whether or not the item is in the player's inventory. 
{
    items[WEAPON_RELIC_RIFLE] = false;
    items[WEAPON_SCALPEL] = false;
    items[MISC_ACTION_FIGURE] = false;
    items[MISC_FIRE_EXTINGUISHER] = false;
    items[MISC_LIFE_RAFT] = false;
}

然后在.h文件中声明如下:

void inventoryArray(bool items[]);

数组中使用的枚举在头文件中定义,如下所示:

enum equipment //This declares a list of enums for each item in the game, consumables, not included. 
{
    WEAPON_RELIC_RIFLE, // = 0
    WEAPON_SCALPEL, // = 1
    MISC_ACTION_FIGURE, // = 2
    MISC_FIRE_EXTINGUISHER, // = 3
    MISC_LIFE_RAFT, // = 4
    MAX_EQUIPMENT
};

读取库存数组的功能是:

void twoScavengerCombat(bool items[])
{
    for (int item = 0; item < MAX_EQUIPMENT; ++item)
    {
        if (items[item] == true) //if true proceed
        {
            switch (item)
            {
            case 0: //if array indices identifier = 0, print relic rifle
                cout << "1: Use the Relic Rifle\n";
                break;
            case 1:
                cout << "2: Use the Scalpel\n";
                break;
            case 2:
                break;
            case 3:
                cout << "3: Use the Fire Extingusher\n";
                break;
            case 4:
                cout << "4: Use the Life Raft\n";
                break;
            default:
                cout << "Error";
                break;
            }
        }
        else
            cout << "Option Unavailible\n"; //if false print Option Unavailible
    }

编译,声明主数据的数组和枚举头看起来像这样:

int toolSearch()
{
   bool items[MAX_EQUIPMENT];
    inventoryArray(items);
   playerGet(items, 0);
}

void twoScavengerCombat(bool items[])\\ declared in this file, but since its just above here i left it as a forward declaration to save space

int main()
{
   toolSearch();
   twoScavengerCombat(items);
   return 0;
}

理想情况下,这会产生结果:使用Relic Rifle                                        选项不可用                                        选项不可用                                        选项不可用                                        选项不可用

但它产生5个选项不可用。我错过了什么?

1 个答案:

答案 0 :(得分:1)

你想要

//bunch of #include<> directives
bool items[MAX_EQUIPMENT];

int toolSearch()
{
    inventoryArray();
    playerGet( 0);
}

void twoScavengerCombat()
...
// other functions here

int main()
{
   toolSearch();
   twoScavengerCombat();
   return 0;
}

请注意,函数中未定义bool items[MAX_EQUIPMENT];。它位于文件顶部,并且在它下面定义的任何内容的平面视图中都是关闭的。这就是全球化的意义。任何人和每个人都可以访问它,如果他们知道它在哪里,或者用extern语句告诉他们它在哪里。它是在程序启动时创建的(即使在main之前,如果变量的初始化逻辑有问题,也会导致一些非常有趣的调试),并且仅在程序启动时才会死。

Lightness Races in Orbit delves a bit deeper here,但更关心的是让全局变量扩展到单个文件

没有必要将项目传递到任何功能,因为每个人都可以看到items缺点是只有一个items因此,如果您有多个玩家,每个玩家都有不同的项目列表,那么你&# 39;重新出现问题。

您可能希望查看std :: vector(可调整大小的数组)和std :: map(这将允许您按名称items["sword"].attackFoe(foe);查找项目)和std :: set(这使得它非常简单查看玩家的内容(if (items.find("Vorpal Hand Grenade") != items.end()) BlowStuffUp();),而不是每次都要搜索每个项目。