首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使函数永久更改全局数组

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

Stack Overflow用户
提问于 2015-08-22 17:05:23
回答 1查看 2.6K关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件中,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件中声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void inventoryArray(bool items[]);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
};

读取库存数组的函数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
    }

已编译,并声明了数组和枚举头,主文件如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}

理想情况下,这将产生结果:使用遗留步枪选项不可用

但是它却产生了5个不可用的选项。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-22 18:01:41

你会想要

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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,所以如果有多个玩家拥有不同的项目列表,您就会遇到问题。

您可能需要查看std::vector (可调整大小的数组)和std::map (这将允许您按名称items["sword"].attackFoe(foe);查找项目)和std::set (这使得查看播放器拥有的内容(if (items.find("Vorpal Hand Grenade") != items.end()) BlowStuffUp();)非常容易,而不必每次搜索每个项目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32162236

复制
相关文章
关于go的只读管道只写管道以及单向管道的理解
上面的例子,writeChan只能对ch变量进行写操作,readChan只能对ch变量进行读操作,这样造成很多同学对管道理解就有了只读和只写管道了,其实管道都是双向的,默认双向可读写,只是管道在函数参数传递时可以使用操作符限制管道的读写,就如上面的例子。
公众号-利志分享
2022/04/25
1K0
Transformers 如何模仿大脑的某些部分
来源:ScienceAI 本文约2500字,建议阅读7分钟 本文将演示如何通过阈值调优来提高模型的性能。 了解大脑如何组织和访问空间信息「我们在哪里」,「拐角处有什么」,「如何到达那里」,这仍然是一项艰巨的挑战。该过程涉及从数百亿个神经元中调用整个记忆网络和存储的空间数据,每个神经元都连接到数千个其他神经元。 神经科学家已经确定了关键元素,例如网格细胞、映射位置的神经元。但更深入将被证明是棘手的:并不是说研究人员可以移除或研究人类灰质的切片来观察基于位置的图像、声音和气味记忆是如何流动并相互连接的。 人工
数据派THU
2022/10/09
6340
Transformers 如何模仿大脑的某些部分
[译]Rxjs&Angular-退订可观察对象的n种方式
在angular项目中我们不可避免的要使用RxJS可观察对象(Observables)来进行订阅(Subscribe)和退订(Unsubscribe)操作;
laggage
2021/02/05
1.2K0
[译]Rxjs&Angular-退订可观察对象的n种方式
【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
尽管看起来Http请求的返回结果是一个可观测对象,但是它却没有map方法,当需要对http请求返回的可观测对象进行操作时,可以使用pipe操作符来实现:
大史不说话
2019/02/21
6.7K0
【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
TOP中只查看某个或某些进程的信息
例:php-fpm的信息 (1)得到php-fpm进程的pid [root@test ~]# pidof php-fpm 29618 29617 29616 29505 29504 29503 (2)top指定查看PID [root@test ~]# top -p 29618 top - 19:07:34 up 75 days, 10:18, 3 users, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleepi
joshua317
2018/04/16
1.1K0
Angular快速学习笔记(4) -- Observable与RxJS
介绍RxJS前,先介绍Observable 可观察对象(Observable) 可观察对象支持在应用中的发布者和订阅者之间传递消息。 可观察对象可以发送多个任意类型的值 —— 字面量、消息、事件。 基本用法和词汇 作为发布者,你创建一个 Observable 的实例,其中定义了一个订阅者(subscriber)函数。 当有消费者调用 subscribe() 方法时,这个函数就会执行。 订阅者函数用于定义“如何获取或生成那些要发布的值或消息”。 要执行所创建的可观察对象,并开始从中接收通知,你就要调用它的 s
JadePeng
2018/05/28
5.3K0
[译] 调试 RxJS 第2部分: 日志篇
原文链接: https://blog.angularindepth.com/debugging-rxjs-part-2-logging-56904459f144 本文为 RxJS 中文社区 翻译文章
用户1687375
2018/06/08
1.2K0
[译] 调试 RxJS 第1部分: 工具篇
原文链接: https://blog.angularindepth.com/debugging-rxjs-4f0340286dd3 本文为 RxJS 中文社区 翻译文章,如需转载,请注明出处,谢谢合作
用户1687375
2018/06/08
1.3K0
浅谈 Angular 项目实战
我不是 Angular 的布道者,但如今自称 Angular 派,使用 Angular 做项目让我有一种兴奋感。目前的三大主流前端框架都研究过,博客中也有三者的相关教程,最早接触的是 React,但是并没有实际的项目经验,只做过一些 Demo 。使用 Vue 做过一个比较复杂的移动端大数据项目,技术栈采用 Framework7 + Vue + Vuex,整体效果还是满意的。
叙帝利
2018/07/31
4.6K0
Angular 16 正式版发布
在之前的Angularv15中,Angular团队通过将独立API从开发者预览版升级至稳定版,在Angular的简易性和开发者体验方面达到了一个重要的里程碑。如今,Angular将继续这一改进的势头,发布了自Angular最初推出以来最大的一次版本更新;在Reactivity、服务器端渲染和工具方面取得了巨大的飞跃。
xiangzhihong
2023/05/07
2.6K0
Angular 16 正式版发布
如何使用 RxJS 更优雅地进行定时请求
实际的业务场景是这样的:前端需要轮循请求后端接口获取文件处理进度,并在前端用进度条展示。如下方所示:
叙帝利
2019/06/03
2.2K0
Angular v16 来了!
六个月前,我们将独立 API从开发人员预览中升级,从而在 Angular 的简单性和开发人员体验方面达到了一个重要的里程碑。今天,我们很高兴地宣布,我们将继续 Angular Momentum,推出自 Angular 首次推出以来最大的版本;在反应性、服务器端渲染和工具方面取得巨大飞跃。所有这一切都伴随着跨功能请求的数十项生活质量改进,在 GitHub 上获得了 2,500 多个赞!
gemron的空间
2023/05/09
2.6K0
用于物联网的大数据参考架构
工业物联网(IIOT,Industrial Internet of Things)正成为社会中的技术趋势与核心业务。IIOT 赋能诸如市政(Municipalities)、工业制造、公用事业、电信,以及保险等各类实体,以解决关键客户与运营的挑战。当前,技术创新在大数据、预测分析和云计算等领域的发展,使得人们可以大规模地集成与分析大量的设备数据,同时对这些数据执行一系列分析以及业务处理流程。
StoneDemo
2018/06/01
1.7K0
Rafy 升级:支持只查询实体的部分属性
Rafy 3.80.4005 添加了新功能:支持只查询部分属性的方式来查询实体。 本文记录对应的设计: 需求 测试用例 设计-API 设计-实现 代码实现 接下来就是实现内部的代码。完成之后,所有单元测试通过。
用户1172223
2021/10/26
6260
ReadProcessMemory会被检测到吗?_仅完成部分readprocess如何解决
hProcess:目标进程的句柄。这个句柄必须有 PROCESS_VM_READ 标记。
全栈程序员站长
2022/11/09
7970
Linux 的命令 ls 只列出部分目录或是文件
ls 默认从小到大顺序列出 当前目录下所有的文件和目录。 现在的问题是,我只想按照这样的顺序列出指定数目的目录或是文件,那样怎么实现呢? 比如 有image目录下有10个子目录 image1 image2….image10, 我直需要列出2个目录 image1 iamge2
全栈程序员站长
2022/07/11
3.8K0
5 分钟内造个物联网 Kafka 管道
原文地址:https://dzone.com/articles/creating-an-iot-kafka-pipeline-in-under-five-minutes
未来守护者
2018/04/25
2.1K0
点击加载更多

相似问题

如何才能让RxJS可观察到的管道访问原始可观测到的排放和管道的先前排放?

10

RxJS使用混合排放物

16

rxjs可观测到角

16

rxjs -可观测到的搜索

10

可观测到的RxJS检测

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文