skovv Temat założony przez niniejszego użytkownika |
[LUA]Skrypty nie włączają się » 2013-11-05 18:30:27 Witajcie :) Mam problem z lua, mianowicie: Mogę wczytać skrypt lua ( luaL_loadfile ), wykonać skrypt tak "po prostu" ( luaL_dofile ), ale nie działa mi niestety to, na czym mi zależy: lua_pcall! Wszystko robiłem ( kilkanaście razy pod rząd ) jak we wszystkich tutorialach na necie i ok, ale kiedy wywołuję funkcję lua_pcall to: 1. Jeśli uruchomię cały plik lua_pcall( L, 0, LUA_MULTRET, 0 )
to za PIERWSZYM razem odpala się, następnym razem nie działa i zwraca 2. 2. Jeśli wywołam konkretną funkcję lua_pushstring( L, "Render" ); lua_gettable( L, LUA_GLOBALSINDEX ); lua_pcall( L, 0, 0, 0 );
to nie działa ani razu, również zwraca 2 :| Używam lua 5.1 i nie rozumiem kompletnie co się dzieje :| Jakiś rok temu używałem lua i śmigał bez najmniejszego problemu :| |
|
den93 |
» 2013-11-06 09:28:25 Przykładowy kod lua5.2: int funkcja_c( lua_State * L ) { int ws = lua_gettop( L ); bool ret = false; if( ws > 1 ) { int chk, frq, dur; frq =( int ) lua_tointegerx( L, 1, & chk ); if( !chk ) goto koniec; dur =( int ) lua_tointegerx( L, 2, & chk ); if( !chk ) goto koniec; _beep( frq, dur ); ret = true; } koniec: lua_settop( L, 0 ); lua_pushboolean( L, ret ); return 1; }
int main() { lua_State * L = luaL_newstate(); luaL_openlibs( L ); luaL_loadfilex( L, "e:\\script.lua", "t" ); lua_call( L, 0, 0 ); lua_getglobal( L, "log2" ); lua_pushnumber( L, 128.0 ); lua_call( L, 1, 1 ); int chk; lua_Number wynik = lua_tonumberx( L, - 1, & chk ); if( chk ) printf( "wynik: %g\n", wynik ); else puts( "zly argument" ); lua_pop( L, 1 ); lua_pushcfunction( L, funkcja_c ); lua_setglobal( L, "biiip" ); const char * skrypt_lua = "\ print('okej: ' .. tostring( biiip(800, 800) ))\ "; luaL_loadbufferx( L, skrypt_lua, strlen( skrypt_lua ), "skrypt_lua", "t" ); lua_call( L, 0, 0 ); lua_close( L ); }
Plik "e:\\script.lua": function log2(liczba) if type(liczba) == 'number' then return 1.44269504088896340736 * math.log(liczba) else return false end end
Twoje problemy biorą się stąd, że: 1. Nie pilnujesz stosu. 2. Nie korzystasz tak jak trzeba z funkcji lua. Poczytaj dokumentacje, tam masz wszystko. |
|
skovv Temat założony przez niniejszego użytkownika |
» 2013-11-07 14:17:21 Wolałbym, aby 5.1 zadziałało. 5.2 nie wypuścili w skompilowanej wersji z libem, a nie chce mi się bawić z kompilowaniem tego.. Nie mam pojęcia jak ;) |
|
den93 |
» 2013-11-07 16:57:29 Biblioteka łączona dynamicznie (.dll), biblioteka importu (.lib coff) i nagłówki (.h .hpp) do 5.2.1: http://sourceforge.net/projects/luabinaries/files/5.2.1/Windows%20Libraries/Dynamic/Binarki lua 5.2.2 (konsola lua, kompilator skryptów i dllka): http://joedf.users.sourceforge.net/luabuilds/Mogę też ci podesłać swoją bibliotekę lua, bo kiedyś sobie to budowałem ze źródeł i gdzieś mam na dysku jeszcze ten projekt więc to nie problem. Kod do dwóch pomocnych funkcji, które napisałem sobie kiedyś jak się bawiłem lua, i które (mam nadzieje) pomogą Ci w zrozumieniu zasady działania tej biblioteki: void pokazstos( lua_State * L ) { int gora = lua_gettop( L ); if( !gora ) puts( "<stos pusty>" ); else if( gora < 0 ) puts( "uwaga: stos ujemny" ); else { int i = 0; do { i++; auto elval = luaL_tolstring( L, i, nullptr ); printf( "%03d: %-16s%s\n", i, luaL_typename( L, i ), elval ); lua_pop( L, 1 ); } while( i != gora ); } }
void polatabeli( lua_State * L, int index ) { index = lua_absindex( L, index ); if( index > 0 && lua_istable( L, index ) ); else { puts( "<err: nie tabela>" ); return; } lua_pushnil( L ); int n = 1; for(; lua_next( L, index ); n++ ) { auto klucz = luaL_tolstring( L, - 2, nullptr ); klucz = klucz ? klucz: "-"; auto typk = luaL_typename( L, - 3 ); auto value = luaL_tolstring( L, - 2, nullptr ); value = value ? value: "-"; auto typv = luaL_typename( L, - 3 ); printf( ":%03d: %-10s%16s | %-10s%s\n", n, typk, klucz, typv, value ); lua_pop( L, 3 ); } if( n == 1 ) puts( "<brak pol>" ); }
int main() { auto * L = luaL_newstate(); luaL_openlibs( L ); lua_newtable( L ); lua_pushboolean( L, true ); lua_setfield( L, - 2, "tak_nie" ); polatabeli( L, - 1 ); pokazstos( L ); lua_setglobal( L, "tabela" ); lua_close( L ); }
|
|
skovv Temat założony przez niniejszego użytkownika |
» 2013-11-07 23:14:07 Dziękuję Ci bardzo za pomoc! :] Pobieram i analizuję Twój kod :] Jeszcze raz dzięki :) |
|
skovv Temat założony przez niniejszego użytkownika |
» 2013-11-07 23:37:51 Niestety mam błąd linkowania :/ Mógłbyś podesłać własną biblioteczkę? :] Używam VC++ 2010. Z góry dzięki :) XScript.obj : error LNK2019: unresolved external symbol _lua_callk referenced in function "public: bool __thiscall XScript::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Load@XScript@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) XScript.obj : error LNK2019: unresolved external symbol _luaL_loadfilex referenced in function "public: bool __thiscall XScript::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Load@XScript@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) XScript.obj : error LNK2019: unresolved external symbol _luaL_openlibs referenced in function "public: bool __thiscall XScript::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Load@XScript@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) XScript.obj : error LNK2019: unresolved external symbol _luaL_newstate referenced in function "public: bool __thiscall XScript::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Load@XScript@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
|
|
skovv Temat założony przez niniejszego użytkownika |
» 2013-11-07 23:50:52 Dopiero co zainstalowałem Win 7 x64. Pobrałem więc wersję lua 64, nie działało. Zainstalowałem 32 i śmiga :] |
|
den93 |
» 2013-11-08 04:16:32 zainstalowałem Win 7 x64. Pobrałem więc wersję lua 64 |
Nie od twojego systemu operacyjnego zależy właściwy wybór biblioteki, a od tego na jakim systemie docelowo ma działać twoja aplikacja. Jeśli twój program wynikowy jest 32bit to takowej biblioteki też potrzebujesz. Jeśli chcesz by twoja aplikacja działała na x86_64 (64bit), to musisz pozmieniać odpowiednie ustawienia w projekcie. |
|
« 1 » |