объединение типов в толуе - PullRequest
       1

объединение типов в толуе

2 голосов
/ 26 февраля 2012

Я думаю, что в толуе есть ошибка, связанная с профсоюзами.Если у вас есть такое объявление:

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 как есть?Или, в противном случае, исправление, которое я могу применить к толуе, которая делает эту работу?

1 Ответ

1 голос
/ 26 февраля 2012

Я понял это!Решением было отредактировать мой файл .pkg следующим образом:

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

Это делает иерархию классов явной для толуа.Казалось бы, я был слишком сосредоточен на том, чтобы содержимое .pkg было допустимым кодом C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...