2011-03-02 2 views
1

내 게임의 SDL/입력 라이브러리를 Free Pascal에 쓰고 있는데 문제가 있습니다.다른 필드를 덮어 쓰는 레코드 필드

나는 요소에 액세스 할 때 다른 요소를 변경하는 변형 레코드가 있습니다.

레코드 종류 :

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

+0

그냥 LongWord입니다. – lochok

+0

좋아, 멋지다. 내 업데이트 된 답변은 노조가 있어야 할 정확한 상태를 반영합니다. – 0xC0000022L

답변

1

이것은이 유형의 레코드 선언의 통합 및 의도 된 동작입니다.

case Device : TInputDevice of 

... 여기서 "마법"입니다.

노동 조합에서 구성원의 저장은 "공유"됩니다.

편집 : (sizeof(TSDLKey) = 4 그 가정하에 ...) 당신이 바이트 오프셋의 관점에서이 기록을 가지고 : 내가 아는 규칙에 의해

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

, TInputDevice은 '당신이 그렇지 않으면, 열거 형이어야한다 명시가 Integer을 줘야 D :

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

NB : 변이 종류는 하나의 부재가 촬상 유효해야 조합원하는 기술이하는 것이 일반적이다 (NESTE을 d 개의 노동 조합).

+0

그래서 나 같은 중복 레이블이 있어도이 동작은 변경되지 않습니까? 나는 그것들을 완전히 분리하고 비슷한 멤버들의 이름을 바꾸어야한다. – lochok

+0

답장을 편집하고 더 눈에 띄게하려고합니다. (주석의 코드 형식은 가능하지 않습니다.) ... – 0xC0000022L

+0

내 대답을 편집했습니다 – 0xC0000022L

관련 문제