【问题标题】:Getting keyboard events saved into an array with graphic window on将键盘事件保存到带有图形窗口的数组中
【发布时间】:2017-04-18 00:38:25
【问题描述】:

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

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) 是我们大学图书馆的一个函数,用于让我们知道按下了哪个键。

除了,当我使用运行代码时,该部分会被完全忽略。该程序仅在该部分之前通知用户它想要他们的名字,然后继续询问其他内容,即在那之后。 我很确定我已经按照我们在课堂上得到的指示进行了操作,但不知何故我不能这样做,而且我不知道我搞砸了什么。请帮忙。

【问题讨论】:

    标签: c allegro5


    【解决方案1】:

    如果我正确地看到了您的代码,当您说key = GFX_GetKeyPress(*(user.name+1)); 时,您实际上是在取消引用CString name[40] 数组中的第二个字符,所以您所做的基本上相当于调用key = GFX_GetKeyPress('A');。我很惊讶你没有收到编译器警告。首先,您传递了错误的类型(int vs. char)。但是,更重要的是,您正在传递一个字符值,其中需要一个指向整数的指针。除了对您没有收到警告感到惊讶之外,我对您的程序由于尝试访问无效内存而没有出现段错误感到非常震惊。

    如果GFX_GetKeyPress(int * keypress_ptr) 能够处理 cstring 缓冲区而不是整数指针,并且假设您打算将指针传递给 user.name 缓冲区中的第二个字符,那么您需要做的就是:key = GFX_GetKeyPress(user.name+1) (这将传递名称数组的第一个元素的地址 + 1 个字节用于下一个索引。)

    我没有使用过 Allegro,所以我不确定这个库的所有细节,但这只是标准的 C 指针知识。

    【讨论】:

      【解决方案2】:

      为了补充 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;
         }
      }
      

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

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 1970-01-01
        • 2014-10-04
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 2011-02-17
        • 1970-01-01
        相关资源
        最近更新 更多