Здравствуйте! Уже довольно давно я начал использовать Lua в своих Android проектах, и вроде бы все шло хорошо, пока мне не захотелось протестировать приложение на x86 архитектуре. И тут начались глюки. При чём проблема очень специфична: выполнение скрипта внезапно прекращается после использования любой c-функции, переданной туда(при этом сама функция успешно выполняется), абсолютно никаких ошибок не возникает, lua_pcall выдает 0, в стеке тоже все в порядке, а скрипт вылетает! От чего это может быть, как исправить?
Конвенция правильно выставлена?
TarasB
> Конвенция
Какая еще конвенция?
kroonk
Конвенция вызова: __stdcall, __cdecl, __thiscall, __fastcall и т.д.
ну сделал так:
int __cdecl function(lua_State* state);
результат тот же.
kroonk
у меня отлично работает Lua на Android/IOS/Mac OS X/Windows
Тестовый проект напиши для начала самый простой вызов функции и изменения переменной. И смотри что не так.
В общем выяснилось, что это я наговнокодил. Суть в том, что в этих c-функциях нужно было получить строку из стека, для получения значения из стека у меня есть специальный метод, имеющий такой вид:
getValue(int n, int type, void* data)
Так вот чтобы получить строку я делал так:
char str[64]; script->getValue(-1, LUA_TSTRING, &str[0]);
А в методе было следующее:
strcpy((char*)data, (const char*)lua_tostring(state, n));
заменил таким образом:
char *str = new char[64]; script->getValue(-1, LUA_TSTRING, str); ... delete[] str;
и все заработало.
kroonk
> и все заработало.
Поменял шило на мыло.
Ты просто вместо стека стал рушить кучу.
RPGman
> Ты просто вместо стека стал рушить кучу.
Ну пока больше ничего не рухнуло.
А вообще, что ты тогда предлагаешь?
kroonk
> А вообще, что ты тогда предлагаешь?
Более чем похоже что за 64 байта вылезла строка, проверяй на это.
=A=L=X=
> Более чем похоже что за 64 байта вылезла строка, проверяй на это.
Эмм... А как проверить? Ну я вызвал strlen с возвращенной из стека строкой, результат 4 для строки "test", вроде все в порядке, за 64 байта не вылезло, или ты что-то другое имеешь в виду?
kroonk
> или ты что-то другое имеешь в виду?
именно это. проверяй на длину прежде чем копировать и если больше 64 переходи на strncpy.
Короче вообще какой-то бред творится, сейчас для теста просто вызвал lua_tostring, без копирования полученной строки и прочих операций, итог - скрипт по прежнему внезапно останавливается, теперь после lua_tostring вызвал usleep(0) и проблем как не бывало! Что происходит то???
Господи! Какой же я идиот! Только сейчас заметил, что в конце функции забыл поставить return, а компилятор и не жаловался. Все, тема закрыта.
Тема в архиве.
Тема закрыта.