将键盘事件保存到带有

时间:2017-04-18 00:38:26

标签: c allegro5

我的小项目有一个窗口弹出,问候用户并询问他们的名字。这就是按下按键并将其保存到数组中以便以后使用的地方。 除此之外,当我运行应该这样做的这部分代码时:

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)是我们在大学里获得的图书馆的功能,用于让我们知道按下哪个键。

除了,当我使用运行代码时,该部分被完全忽略。该程序仅通知用户它想要他们的名字,这是在该部分之前,然后继续询问其他事情,在此之后。 我大多肯定我已经按照课程中的指示行事,但不知何故我不能这样做,而且我不知道我搞砸了什么。请帮忙。

2 个答案:

答案 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;
   }
}

尽管通常不建议使用模态循环,但这应该可行。