我遇到了一个小问题,我到处都看,但我相信我看错了方向。我在这里创建了一个帐户,希望解决我遇到的一个小问题。我正在编写RPG编程中,当我尝试显示一个角色"魔法咒语"时,我只能显示[3]。 [0] [1] [2]让我的比赛崩溃了。游戏是用C ++编写的。
我的代码示例如下:
创建我的结构:
struct Fighter {
int HP; //max 999
int maxHP;
int MP; //max 999
int maxMP;
int STR; //max 255
int CON; //max 255
int AGL; //max 100
bool dead;
const char* Magic[];
};
Fighter * player = new Fighter[5];
使用这些参数为4个党员初始化和分配元素:
void InitPlayer(int pClass, int p)
{
if(pClass == 0) //Knight
{
player[p].maxHP = 750;
player[p].HP = player[p].maxHP;
player[p].maxMP = 0;
player[p].MP = player[p].maxMP;
player[p].STR = 200;
player[p].CON = 0;
player[p].AGL = 35;
}
else if(pClass == 1) //Ninja
{
player[p].maxHP = 675;
player[p].HP = player[p].maxHP;
player[p].maxMP = 0;
player[p].MP = player[p].maxMP;
player[p].STR = 175;
player[p].CON = 0;
player[p].AGL = 80;
player[p].Magic[0] = "Cure";
player[p].Magic[1] = "Haste";
player[p].Magic[2] = "Sleep";
}
//... More Character code
}
我在这里绘制/打印"魔术"到屏幕:
Printf_xy(123,223,player[0].Magic[0]); //Crash
Printf_xy(123,233,player[1].Magic[0]); //Crash
Printf_xy(123,243,player[2].Magic[0]); //Crash
Printf_xy(123,253,player[3].Magic[0]); //Prints "Cure" does not crash
正如你所看到的,只有当我显示播放器[3]时它才会起作用。我确信我忘记做某事或错误地初始化某些东西。任何帮助将不胜感激。
答案 0 :(得分:1)
Magic
是一个零长度数组 - 当您为其分配任何内容时,甚至尝试访问Magic[0]
时,您正在数组边界外访问。
如果您知道所需的魔术条目的最大数量,请将其用作数组大小,例如:
const int MagicLimit = 10
...
const char* Magic[MagicLimit];
更好的是,如果您使用的是c ++,请使用std :: vector来保存魔术字符串(也使用std :: string),这样您就可以轻松判断列表的长度。
例如:
std::vector<std::string> Magic;