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

如何使函数永久更改全局数组
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

复制
相关文章
HTML单击按钮弹出悬浮窗+页面遮罩
<meta charset="utf-8" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
用户7718188
2021/10/08
15.8K1
Android之按钮点击事件(单击、双击、长按等)
在布局文件中添加按钮点击事件 1、在xml文件中 为 Button 添加android:onclick属性
程思扬
2023/07/24
2.4K0
类模块应用示例:获取单击的命令按钮名称
这个示例来源于ozgrid.com,有兴趣的朋友可以研究。在用户窗体上共有24个命令按钮,如下图1所示。
fanjy
2023/10/04
3080
类模块应用示例:获取单击的命令按钮名称
使用 WCF Web Service Reference Provider 工具
多年来,许多 Visual Studio 开发者在其. NET Framework 项目需要访问 Web 服务时,都享受到了添加服务引用工具所带来的工作效率。 WCF Web 服务引用工具是 Visual Studio 连接服务的扩展,提供了类似于 .NET Core 和 ASP.NET Core 项目的“添加服务引用”功能的体验 。 此工具可从网络位置的当前解决方案的 web 服务中或从 WSDL 文件中检索元数据,并生成包含可用于访问 web 服务的 Windows Communication Foundation (WCF) 客户端代理代码的可兼容 .NET Core 的源文件。
用户4268038
2022/01/07
1.9K0
选择篇(039)-单击按钮时event.target是什么?
导致事件的最深嵌套元素是事件的目标。你可以通过event.stopPropagation停止冒泡
齐丶先丶森
2022/05/12
1.6K0
jQuery 双击事件(dblclick)时,不触发单击事件(click)
在jQuery的事件绑定中,执行双击事件(dblclick)时能触发两次单击事件(click)。即一个标签元素(如div等),如果元素同时绑定了单击事件(click)和双击事件(dblclick),那么执行单击事件(click)时,不会触发双击事件(dblclick), 执行双击事件(dblclick)时却会触发两次单击事件(click)。 先看一下点击事件的执行顺序:
飞奔去旅行
2019/06/13
5.3K0
[C#] Blazor练习2
Razor 文件定义了构成部分应用 UI 的组件。Blazor 中的组件类似于 ASP.NET Web Forms 中的用户控件。
科控物联
2022/03/29
1.8K0
[C#] Blazor练习2
C# 设计模式 责任链 后退按钮使用责任链
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。《JAVA与模式》
林德熙
2018/09/18
9310
Windows凭据不工作
如果不是敲错IP、用户名、密码,报凭据不工作,一般情况下执行这几句命令后重启远程服务就正常了
Windows技术交流
2021/06/15
6.1K0
MyVBA加载宏——添加自定义菜单02——给按钮添加单击事件
在2003版本之前的Excel里使用过VBA的话,应该接触过在Excel里添加自定义菜单,使用方法和前面说的在VBE里添加菜单是类似的。
xyj
2020/07/28
2.8K0
MyVBA加载宏——添加自定义菜单02——给按钮添加单击事件
C# —— 点击按钮动态打开ComboBox
网上搜索了好多资料,大多是重绘ComboBox或者使用自定义控件创建一个全新的ComboBox(并非基于window的ComboBox)。
vv彭
2021/06/22
2.9K0
C# —— 点击按钮动态打开ComboBox
使用Apworks开发基于CQRS架构的应用程序
在Apworks框架发布Alpha版本的时候,我已经针对其开发案例:Tiny Library CQRS写了Walkthrough文档,地址是:http://apworks.org/custom/documents/wlkthr_BuildAppsUsingApworks/。为了走国际化道路,这篇文章是全英文的,社区里有不少网友表示难以理解。趁着这几天不算很忙,我抽空将其又翻译回中文,并加入更多的批准内容,供爱好DDD、CQRS和架构设计的朋友阅读参考,也希望大家能够积极参加讨论。 简介 Apworks是一套
逸鹏
2018/04/09
9800
Lightweight Test Automation Framework之旅
Lightweight Test Automation Framework是ASP.NET QA团队开发的自动化集成测试框架,并且应用在ASP.NET QA团队的自动化测试产品中,目前最新版本是April Update,这个框架的作用与WatiN和Selenium类似,可操作浏览器对应用程序编写回归测试。根据ASP.NET QA团队博客上发布的Lightweight Test Automation Framework April Release,这个版本主要是修复bug和增加一些新特性,主要特性如下: 用户
张善友
2018/01/30
1.8K0
Lightweight Test Automation Framework之旅
c#实战教程_ps初学者入门视频
大家好,又见面了,我是你们的朋友全栈君。 C#基础教程-c#实例教程,适合初学者。 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言,还需要认真阅读有关C#语言的专著。 1.1 C#语言特点 Microsoft.NET(以下简称.NET)框架是微软提出的新一代Web软件开发模型,C#语言是.NET框架中新一代的开发工具。C#语言是一种现代、面向对象的语言,它简化了C++语言在类、命名空间、方法重载和异常处理等方面的操作,它摒弃了C++的复杂性,更易使用,更少出错。它使用组件编程,和VB一样容易使用。C#语法和C++和JAVA语法非常相似,如果读者用过C++和JAVA,学习C#语言应是比较轻松的。 用C#语言编写的源程序,必须用C#语言编译器将C#源程序编译为中间语言(MicroSoft Intermediate Language,MSIL)代码,形成扩展名为exe或dll文件。中间语言代码不是CPU可执行的机器码,在程序运行时,必须由通用语言运行环境(Common Language Runtime,CLR)中的既时编译器(JUST IN Time,JIT)将中间语言代码翻译为CPU可执行的机器码,由CPU执行。CLR为C#语言中间语言代码运行提供了一种运行时环境,C#语言的CLR和JAVA语言的虚拟机类似。这种执行方法使运行速度变慢,但带来其它一些好处,主要有:  通用语言规范(Common Language Specification,CLS):.NET系统包括如下语言:C#、C++、VB、J#,他们都遵守通用语言规范。任何遵守通用语言规范的语言源程序,都可编译为相同的中间语言代码,由CLR负责执行。只要为其它操作系统编制相应的CLR,中间语言代码也可在其它系统中运行。  自动内存管理:CLR内建垃圾收集器,当变量实例的生命周期结束时,垃圾收集器负责收回不被使用的实例占用的内存空间。不必象C和C++语言,用语句在堆中建立的实例,必须用语句释放实例占用的内存空间。也就是说,CLR具有自动内存管理功能。  交叉语言处理:由于任何遵守通用语言规范的语言源程序,都可编译为相同的中间语言代码,不同语言设计的组件,可以互相通用,可以从其它语言定义的类派生出本语言的新类。由于中间语言代码由CLR负责执行,因此异常处理方法是一致的,这在调试一种语言调用另一种语言的子程序时,显得特别方便。  增加安全:C#语言不支持指针,一切对内存的访问都必须通过对象的引用变量来实现,只允许访问内存中允许访问的部分,这就防止病毒程序使用非法指针访问私有成员。也避免指针的误操作产生的错误。CLR执行中间语言代码前,要对中间语言代码的安全性,完整性进行验证,防止病毒对中间语言代码的修改。  版本支持:系统中的组件或动态联接库可能要升级,由于这些组件或动态联接库都要在注册表中注册,由此可能带来一系列问题,例如,安装新程序时自动安装新组件替换旧组件,有可能使某些必须使用旧组件才可以运行的程序,使用新组件运行不了。在.NET中这些组件或动态联接库不必在注册表中注册,每个程序都可以使用自带的组件或动态联接库,只要把这些组件或动态联接库放到运行程序所在文件夹的子文件夹bin中,运行程序就自动使用在bin文件夹中的组件或动态联接库。由于不需要在注册表中注册,软件的安装也变得容易了,一般将运行程序及库文件拷贝到指定文件夹中就可以了。  完全面向对象:不象C++语言,即支持面向过程程序设计,又支持面向对象程序设计,C#语言是完全面向对象的,在C#中不再存在全局函数、全局变量,所有的函数、变量和常量都必须定义在类中,避免了命名冲突。C#语言不支持多重继承。 1.2 编写控制台应用程序 使用SDK命令行工具编写控制台程序 第一个程序总是非常简单的,程序首先让用户通过键盘输入自己的名字,然后程序在屏幕上打印一条欢迎信息。程序的代码是这样的: using System;//导入命名空间。//为C#语言新增解释方法,解释到本行结束 class Welcome//类定义,类的概念见下一节 { /*解释开始,和C语言解释用法相同 解释结束*/ static void Main()//主程序,程序入口函数,必须在一个类中定义 { Console.WriteLine(“请键入你的姓名:”);//控制台输出字符串 Console.ReadLine();//从键盘读入数据,输入回车结束 Console.WriteLine(“欢迎!”); } } 可以用任意一种文本编辑软件完成上述代码的编写,然后把文件存盘,假设文件名叫做welcome.c
全栈程序员站长
2022/09/30
15.7K0
Page.ClientScript.RegisterStartupScript() 方法「建议收藏」
Page.ClientScript.RegisterStartupScript() 方法 与Page.ClientScript.RegisterClientScriptBlock() 方法
全栈程序员站长
2022/09/09
2.1K0
全面的ASP.NET Core Blazor简介和快速入门
   因为咱们的MongoDB入门到实战教程Web端准备使用Blazor来作为前端展示UI,本篇文章主要是介绍Blazor是一个怎样的Web UI框架,其优势和特点在哪?并带你快速入门上手ASP.NET Core Blazor(当然这个前提是你要有一定的C#编程基础的情况,假如你完全没有接触过C#的话建议你先从基本语法学起)。
追逐时光者
2023/06/16
1.4K0
全面的ASP.NET Core Blazor简介和快速入门
Asp.Net MVC4入门指南(3):添加一个视图
在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML的过程。 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所引入的Razor视图引擎。Razor视图模板文件使用.cshtml文件扩展名,并提供了一个优雅的方式来使用C#语言创建所要输出的HTML。用Razor编写一个视图模板文件时,将所需的字符和键盘敲击数量降到了最低,并实现了快速,流畅的编码工作流程。 当前在控制器类中的Index方法返回了一个硬编码的字符串。更
葡萄城控件
2018/01/10
1.1K0
Asp.Net MVC4入门指南(3):添加一个视图
Visual Studio 2019 16.1 更新摘要
Visual Studio 2019 版本 16.1 的摘要 IDE 默认情况下,Visual Studio IntelliCode 随包含 C#、XAML 或 C++ 的任何工作负载一起安装。 默认支持 C# 和 XAML IntelliCode。 可以通过“工具”>“选项”>“IntelliCode”来启用对 C++ 和 JavaScript/TypeScript 的支持 我们添加了每监视器感知功能的支持。 新codefixes可用于C#。 现已公开发布 Visual Studio IntelliCo
Edi Wang
2019/07/09
5.7K0
Visual Studio 2019 16.1 更新摘要
Android Button 单击事件
方法一:在XML文件中指定 单击事件函数 <Button             android:id="@+id/button1"             android:layout_width="120dip"             android:layout_height="wrap_content"             android:layout_alignParentLeft="true"             android:layout_below="@+id/textView1
磊哥
2018/05/08
1.7K0
按钮与交互-使用按钮触发操作
在本节中,我们将介绍一个重要且简单的元素,即按钮。这个小元素可以改变整个UX。我们将使用该按钮来缩放我们的3D模型。此外,我们将尝试更改手机的壁纸。对于您的型号,如果您有不同的材质或颜色,您也可以更改它。
iOSDevLog
2019/06/17
4.6K0
按钮与交互-使用按钮触发操作

相似问题

有办法在Django中对聚合进行分组吗?

10

有办法在graphQL中对查询进行分组吗?

10

有办法在xslt中对非子元素进行分组吗?

11

有办法对SQL函数进行分组吗?

37

有办法在MySQL中进行部分分组吗?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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