Я думаю, что в толуе есть ошибка, связанная с профсоюзами.Если у вас есть такое объявление:
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 *);
, тогда будет нормально иметь код lua, подобный следующему:
event = create()
frobnicate(event)
print(event.window.windowId)
frobnicate(event)
Но второй вызов frobnicate (событие) завершится неудачно сошибка:
argument #1 is 'SDL_WindowEvent'; 'SDL_Event' expected.
Небольшое нажатие на отладчик показывает, что tolua_pushusertype в доступе event.window переписывает тип моей переменной!
Вот что я пробовал до сих пор: Из моего объявления tolua создаст следующий вызов для объявления класса SDL_WindowEvent:
tolua_cclass(tolua_S,"SDL_WindowEvent","SDL_WindowEvent","",NULL);
, тем самым сделав SDL_Event и 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 5.1.4, но та же проблема возникает с tolua ++ 1.92.3.
Есть личто я делаю не так, в первую очередь?Есть ли способ, которым я могу переписать свою декларацию, чтобы эта работа работала с tolua как есть?Или, в противном случае, исправление, которое я могу применить к толуе, которая делает эту работу?