2011-03-02 170 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