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

[Lua i C++] Kilka pytań

Ostatnio zmodyfikowano 2010-10-10 08:35
Autor Wiadomość
programista12
Temat założony przez niniejszego użytkownika
» 2010-10-07 07:27:27
A mógłbyś mi podać jakiś kod, bo samemu mi nie wychodzi? Napisałem też drugą funkcję wykonującą polecenie:
C/C++
void Console::DoString2( std::string str )
{
   
    if( luaL_loadbuffer( L, str.c_str(), std::strlen( str.c_str() ), str.c_str() ) || lua_pcall( L, 0, 0, 0 ) )
    {
        std::string a = lua_tostring( L, - 1 );
        this->PrintText( "P..." );
        //if(a != "" || a != "\0")
        this->PrintText( a );
        lua_pop( L, 1 );
    }
    else
    {
        this->PrintText( "ERROR" );
    }
}
Ale jak wpisuję np. "x = 10" to w konsoli wypisuje mi "ERROR". Proszę o jakieś rady.
P-22636
michalp
» 2010-10-07 17:50:54
Jeżeli zmienna jest globalna to musisz pobrać ją jak funkcję. Wtedy będziesz miał ją na stosie (czyli w ten sposób możesz wrzucić tę zmienną na stos, chyba że trzeba będzie wywołać lua_tonumber (lub lua_tointeger), zdjąć zmienną ze stosu a potem wrzucić jej wartość).
P-22648
programista12
Temat założony przez niniejszego użytkownika
» 2010-10-09 12:28:59
Udało mi się wreszcie opanować przerzucanie funkcji C++ do Lua! Oto kod przykładowego programu:
C/C++
#include <iostream>
#include <conio.h>
#include <string>

extern "C"
{
    #include "lua.h"
    #include "lauxlib.h"
    #include "lualib.h"
}

lua_State * L;
int pozycja = 0;

static int lua_PobierzPozycje( lua_State * L )
{
    lua_pushinteger( L, pozycja );
    return 1;
}

static int lua_Ruch( lua_State * L )
{
    while( pozycja != lua_tointeger( L, 1 ) )
    {
        pozycja += 1;
    }
    return 0;
}

static int lua_PrintText( lua_State * L )
{
    std::cout << lua_tostring( L, 1 ) << std::endl;
    return 0;
}

void main()
{
    L = lua_open();
    luaL_openlibs( L );
    lua_register( L, "PobierzPozycje", lua_PobierzPozycje );
    lua_register( L, "PrintText", lua_PrintText );
    lua_register( L, "Ruch", lua_Ruch );
    bool exit = false;
    std::string cmd;
    while( !exit )
    {
        std::cout << ">";
        std::getline( std::cin, cmd );
        if( cmd == "!exit" )
        {
            exit = true;
        }
        else
        {
            luaL_dostring( L, cmd.c_str() );
            std::cout << std::endl;
        }
    }
    lua_close( L );
    return;
}
I wszystko pięknie działa! Najlepsze jest to, że nie trzeba używać luabind. Rozwiązanie znalazłem w artykule z gamedev.pl (strona 8). Pokombinowałem i wyszło! Dziękuję wszystkim za pomoc! Jeżeli ktoś miałby jakieś pytania, to proszę pytać tutaj, chętnie odpowiem.
P-22678
DejaVu
» 2010-10-09 19:25:23
Napisz krótkiego arta na temat tego :)
P-22681
programista12
Temat założony przez niniejszego użytkownika
» 2010-10-10 08:35:35
Arta może i napiszę, ale najpierw muszę jeszcze ogarnąć luabind, bo nie chcę z każdej klasy, z której przenoszę funkcję robić singletona.
P-22695
1 « 2 »
Poprzednia strona Strona 2 z 2