2012-02-26 2 views
2

룰라에는 노동 조합에 관한 버그가 있다고 생각합니다. 이 같은 선언이있는 경우 : 오류와 함께 실패합니다톨루아의 공용체 유형

event = create() 
frobnicate(event) 
print(event.window.windowId) 
frobnicate(event) 

그러나 frobnicate 두 번째 호출 (이벤트) : 다음

struct SDL_WindowEvent { 
    int type; 
    int windowID; 
}; 

union SDL_Event { 
    int type; 
    SDL_WindowEvent window; 
}; 

extern SDL_Event * create(void); 
extern void frobnicate(SDL_Event *); 

을 루아과 같은 코드를 가지고 괜찮을한다

argument #1 is 'SDL_WindowEvent'; 'SDL_Event' expected. 

디버거에서 조금 파고들 경우 event.window 액세스의 tolua_pushusertype이 내 변수 유형을 다시 작성합니다! 여기

는 지금까지 시도했습니다 무엇 다음 SDL_Event 및 SDL_WindowEvent 관련되지 않은 두 클래스의 기본하지 클래스를 따라서

tolua_cclass(tolua_S,"SDL_WindowEvent","SDL_WindowEvent","",NULL); 

만들기 : 내 선언에서 tolua는 SDL_WindowEvent 클래스를 선언하는 다음 호출을 생성합니다 서로. 의는 나중에에서 다음에 해당 나는 코드가 있다고 가정 해 봅시다 :

tolua_pushusertype(tolua_S, event, "SDL_Event"); 
assert(tolua_isusertype(tolua_S,1,"SDL_Event",0,&tolua_err)); 
tolua_pushusertype(tolua_S, event->window, "SDL_WindowEvent"); 
assert(tolua_isusertype(tolua_S,2,"SDL_Event",0,&tolua_err)); 

다음 네 번째 줄에서 어설 션이 실패, 스택에 값이 두 번째 줄에서 어설 이후 마술 변경된 유형이 있기 때문이다. 이는 tolua_pushusertype()이 그것을 변경하기 때문입니다 - foo와 foo.window는 같은 주소를 가지고 내부적으로 tolua는 각 주소마다 하나의 유형 만 추적합니다. tolua_isusertype()은 객체의 기본 유형이 SDL_Event 였지만 위의 tolua_cclass 선언에 네 번째 인수로 "SDL_Event"가 필요하면 만족했을 것입니다. 내가 수동으로 수정하면 양쪽 모두 어설 션을 통과하지만 수동으로 변경할 수는 없습니다. 나는 이것을 수행하기 위해 tolua를 고치고 싶지만, 아직하지는 않습니다. 잘 이해하고 있습니다. 그것이 옳은 일인 지 알지 못합니다.

나는 tolua 5.1.4를 사용하고 있지만 tolua ++ 1.92.3에서도 같은 문제가 발생합니다.

내가 먼저 잘못하고있는 것이 있습니까? 톨 루아를 그대로 사용하여 선언문을 다시 쓸 수있는 방법이 있습니까? 아니면, 실패,이 작품을 만드는 tolua에 적용 할 수있는 수정?

답변

1

나는 그것을 알아 냈다! 해결 방법은 .pkg 파일을 다음과 같이 편집하는 것입니다.

struct SDL_WindowEvent : SDL_Event { 
    int type; 
    int windowID; 
}; 

이렇게하면 tolua에 대해 클래스 계층이 명시됩니다. 유효한 C 코드 인 .pkg 내용에 너무 집중했습니다.

+0

해결책을 찾은 경우 문제를 해결 된 것으로 표시하십시오. –

+0

그래서 내 자신의 대답을 받아 들일 수있게되기까지 2 일을 기다렸습니다. – Enno

관련 문제