我的小项目有一个窗口弹出,问候用户并询问他们的名字。这就是按下按键并将其保存到数组中以便以后使用的地方。 除此之外,当我运行应该这样做的这部分代码时:
while (done != 0)
{
GFX_GetKeyPress(&key);
if (key == ALLEGRO_KEY_ESCAPE)
{
done = 1;
}
else
{
key = GFX_GetKeyPress(*(user.name+1));
}
}
将数组隐藏在结构中:
struct user_details
{
char name[40];
}
并通过struct user_details user
在主函数中调用。
此外,GFX_GetKeyPress(int * keypress_ptr)
是我们在大学里获得的图书馆的功能,用于让我们知道按下哪个键。
除了,当我使用运行代码时,该部分被完全忽略。该程序仅通知用户它想要他们的名字,这是在该部分之前,然后继续询问其他事情,在此之后。 我大多肯定我已经按照课程中的指示行事,但不知何故我不能这样做,而且我不知道我搞砸了什么。请帮忙。
答案 0 :(得分:0)
如果我正确地看到你的代码,当你说key = GFX_GetKeyPress(*(user.name+1));
时,你实际上是取消引用CString name[40]
数组中的第二个字符,所以你所做的基本上等同于调用{{ 1}}。我很惊讶你没有收到编译器警告。首先,你传递了错误的类型(int与char)。但是,更重要的是,您传递的字符值是指向整数的指针。除了惊讶你没有得到警告之外,我非常震惊你的程序因为试图访问无效内存而没有发生段错误。
如果key = GFX_GetKeyPress('A');
能够处理cstring缓冲区而不是整数指针,并且假设您打算将指针传递给user.name缓冲区中的第二个字符,那么您需要做的就是:{ {1}}(将传递名称数组的第一个元素的地址+下一个索引的1个字节。)
我没有和Allegro合作,所以我不确定图书馆的所有细节,但这只是标准的C指针知识。
答案 1 :(得分:0)
要添加到SpencerD的答案中,您只需存储一个键,并传递不兼容的类型并忽略其他所有按键。
假设GFX_GetKeyPress返回键缓冲区中的下一个字符,则这样会更合适:
int index = 0;
while (GFX_GetKeyPress(&key) != ALLEGRO_KEY_ESCAPE) {
if (index < 40) {/// Hardcoded constants are bad
user.name[index] = key;
++index;
}
else {
break;
}
}
尽管通常不建议使用模态循环,但这应该可行。