2011-03-02 119 views
1

我正在爲Free Pascal編寫我的遊戲的SDL /輸入庫,並且我正面臨一個問題。記錄字段覆蓋其他字段

我有一個變種記錄,當我訪問它的一個元素,改變其他元素。

記錄類型是:

tInput = Record 
    case Device: TInputDevice of 
     ID_KeyOnce, ID_KeyCont:      (Key:   TSDLKey); 
     ID_MouseButton:        (MouseButton: Byte); 
     ID_MouseAxis, ID_JoyAxis, 
      ID_JoyBall, ID_JoyHat:     (Axis:  Byte); 
     ID_JoyButton, ID_JoyButtonOnce, ID_JoyAxis, 
      ID_JoyHat, ID_JoyBall:     (Which:  Byte); 
     ID_JoyButton, ID_JoyButtonOnce:    (Button:  Byte); 

端;

的崩潰是代碼:

with Input do begin 
    Device := ID_JoyAxis; 
    Which := 0; 
    Axis := 1; 
end; 

當軸被設置爲一個,所有在記錄中的其他變量去一二!

這是一個已知的錯誤嗎?或者我不知道的一些功能?或者我搞砸了?

+0

你有關於TSDLKey的更多細節嗎?它是一個枚舉類型還是一個類實例? ... – 0xC0000022L 2011-03-02 03:52:33

+0

這只是一個LongWord – lochok 2011-03-02 04:02:07

+0

好吧,很酷,那麼我更新的答案恰恰反映了你的工會應該在的狀態。 – 0xC0000022L 2011-03-02 04:12:55

回答

1

這被稱爲聯合和這種類型的記錄聲明的預期行爲。

case Device : TInputDevice of 

......這裏是「魔術」。

在一個聯盟中,成員的存儲是「共享」的。

編輯:以你在字節偏移方面均有備案(...假設sizeof(TSDLKey) = 4下):

------------------------------------------------ 
00 | Key | MouseButton | Axis | Which | Button | 
---|  |-------------|------|-------|--------| 
01 |  |    |  |  |  | 
---|  |-------------|------|-------|--------| 
02 |  |    |  |  |  | 
---|  |-------------|------|-------|--------| 
03 |  |    |  |  |  | 
------------------------------------------------ 

通過我知道規則,TInputDevice應該是一個枚舉類型,否則你」 d具有明確給予Integer有:

type xyz = record 
    case integer of 
    0: (foo: Byte); 
    1: (bar: Integer); 
end; 

注:這是習慣的變異類型有一個成員描述其工會成員應挑選和有效(索泰d工會)。

+0

所以 - 即使你(像我)有重複的標籤,這種行爲不會改變?我必須將它們完全分開並重命名相似的成員? – lochok 2011-03-02 03:53:30

+0

我會編輯我的回覆,並嘗試使其更明顯(代碼格式在評論中是不可能的)... – 0xC0000022L 2011-03-02 04:02:50

+0

編輯我的答案 – 0xC0000022L 2011-03-02 04:17:45