2014-10-04 106 views
1

我在閱讀lazyfoo的SDL2.0教程,在第三個教程中展示瞭如何使用SDL_Event,我去探索更多關於SDL_Event's tutorial page的SDL_Event,並找到它的聯盟類型,但在他們使用的配售活動部分的頁面上SDL_Event(一個聯合)爲用戶分配兩個值類型和其他值之一,我的疑問是如何將兩個值分配給聯盟而沒有錯誤或非法賦值? 我確實再去檢查工會的定義here但它也表示,你不能同時給工會分配兩個值。我們如何能夠在SDL_Event(聯合)中分配兩個值?

P.S. 在高於SDL鏈路的代碼是:

SDL_Event user_event; 

user_event.type=SDL_USEREVENT; 
user_event.user.code=2; 
user_event.user.data1=NULL; 
user_event.user.data2=NULL; 
SDL_PushEvent(&user_event); 

回答

1

聯盟使用一個一塊內存,但訪問該存儲器可通過任何的「聯合在一起」類型來完成。關鍵是不要將值(例如)分配給用戶成員和鼠標成員。當你去讀取值時,結果是未定義的。

換句話說,這是好的:

user_event.user.code=2; 
user_event.user.data1=NULL; 

但是,這並不:

user_event.user.code=2; 
// BAD! 'key' is from a different type in the union! 
user_event.key.state=SDL_PRESSED; 

現在,成員尤其是特殊的。 SDL與每個可能的事件類型中的第一個成員具有相同的變量(數據類型和名稱)。它也與整個聯盟的第一個成員具有相同的變量。這樣,內存總是有這個類型變量第一,並且可以可靠地訪問,無論它通過哪個工會成員訪問。這是C規範中的一個特殊情況,其中「如果聯合包含多個共享公共初始序列的結構,並且聯合對象當前包含這些結構中的一個,則允許檢查任何公共初始部分他們「。這是C89規範草案副本中的第3.3.2.3節。

+1

以及我的疑問是關於類型分配和用戶分配,因爲他們都是不同的類型,但正在分配上述sdl語句 – Amitesh 2014-11-15 06:37:54

+0

哦,我明白了。我剛剛更新了我的答案,以包括這一點。 – 2014-11-16 19:10:15

+0

嗯,謝謝@Jonny – Amitesh 2014-11-18 13:26:12

相關問題