2017-04-18 46 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指針知識。