Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[LUA]Skrypty nie włączają się

Ostatnio zmodyfikowano 2013-11-08 04:16
Autor Wiadomość
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
C/C++
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ę
C/C++
lua_pushstring( L, "Render" );
lua_gettable( L, LUA_GLOBALSINDEX ); // to nawet komentowałem, dalej to samo.
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 :|
P-95370
den93
» 2013-11-06 09:28:25
Przykładowy kod lua5.2:
C/C++
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 ); // stdlib.h
        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" ); // kompilacja pliku i na stos
    lua_call( L, 0, 0 ); // wykonanie pliku
   
    // 1. Uruchamianie funkcji ze skryptu:
    lua_getglobal( L, "log2" ); // wrzuć na stos funkcję log2 załadowaną z pliku
    lua_pushnumber( L, 128.0 ); // argument funkcji 128
    lua_call( L, 1, 1 ); // wywołaj z jednym argumentem i oczekując jednego obiektu na powrót
   
    int chk; // do sprawdzania czy obiekt jest liczbą
    lua_Number wynik = lua_tonumberx( L, - 1, & chk ); // zwrócony wynik zapisz z wierzchołka stosu
    if( chk ) printf( "wynik: %g\n", wynik ); // jeśli wynik to liczba
    else puts( "zly argument" );
   
    lua_pop( L, 1 ); // zdejmij ze stosu wynik
   
    // 2. Wywoływanie funkcji z programu w skrypcie
    lua_pushcfunction( L, funkcja_c ); // wrzuć na stos funkcję napisaną w c
    lua_setglobal( L, "biiip" ); // nadaj jej nazwę skryptową
   
    const char * skrypt_lua = "\
     print('okej: ' .. tostring( biiip(800, 800) ))\
     "; // skrypt lua do wykonania z pamięci
    luaL_loadbufferx( L, skrypt_lua, strlen( skrypt_lua ), "skrypt_lua", "t" ); // ładuj z bufora i na stos
    lua_call( L, 0, 0 ); // wykonaj
   
    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.
P-95440
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 ;)
P-95541
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:
C/C++
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 );
    // w tym miejscu na stosie jeszcze nie ma nic
   
    lua_newtable( L ); // (makro) tworzy nową tabele + na stos
    lua_pushboolean( L, true ); // true (bool) na stos
    // teraz mamy 2 elementy, tablica i bool
    lua_setfield( L, - 2, "tak_nie" ); // wrzuć true do tabeli: nieznana_tablica['tak_nie'] = true // na stosie zostaje tylko tabela
    polatabeli( L, - 1 ); // wyświetla wszystkie pola (typ klucza, klucz, typ wartości, wartość) tablicy znajdującej się na wskazanej pozycji stosu (-1 tj wierzchołek)
    pokazstos( L ); // wylicza elementy stosu (od 1 do wierzchołka)
   
    lua_setglobal( L, "tabela" ); // nadanie nazwy tabeli (uczynienie jej globalną), tabela znika ze stosu
    // albo lua_pop(L, 1); // (makro) zdejmij jeden element
   
    lua_close( L );
}
P-95547
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 :)
P-95608
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)
P-95609
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 :]
P-95613
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.
P-95621
« 1 »
  Strona 1 z 1