2017-04-18 75 views
0

我的小项目获取键盘事件有一个窗口弹出,问候用户,并询问他们的名字。这就是按下键并将其保存到数组中以便稍后使用的地方。 除,当我运行这部分代码是应该这样做:保存与图形窗口阵列上

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

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

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

我没有与Allegro合作过,因此我不确定库的所有入口和出口,但这只是标准的C指针知识。