Autor Wątek: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua  (Przeczytany 2145 razy)

Offline cybergod

  • Użytkownik

# Październik 09, 2010, 20:55:01
Chodzi o to, że załóżmy mam klasę i chcę przenieść kilka jej funkcji do Lua. Wiem, że trzeba użyć lua_register() i że funkcja musi być statyczna, ale czy można jakoś zrobić, żeby funkcja nie musiała być statyczna i można by było ją przenieść do Lua? Nie chcę z powodu tych kilku funkcji robić singletona, a deklaracja statycznej funkcji w niestatycznej klasie powoduje błędy kompilacji.
Proszę o odpowiedzi, z góry dziękuję za pomoc.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline hfjh

  • Użytkownik

# Październik 09, 2010, 21:04:34
Nie da się bezpośrednio. Może zamiast tego przekazywać do skryptu wskaźnik skonwertowany na inta, a potem zrobić coś takiego:
Kod: (cpp) [Zaznacz]
int LuaMethod(lua_State* L)
{
     Object* tmp=(Object*)lua_touserdata(L, 0);
     tmp->method(L);
}

EDIT: znalazłem w dokumentacji funkcje lua_touserdata i lua_pushlightuserdata.
« Ostatnia zmiana: Październik 09, 2010, 21:12:04 wysłana przez hfjh »

Offline vashpan

  • Użytkownik
    • Strona

# Październik 09, 2010, 21:55:37
Jezeli nie chcesz wiedziec jak to dziala "od srodka" i zeby po prostu dzialalo, zastosuj jedna z bibliotek pozwalajacych na eksport kodu C++ do Lua ( i na odwrot ) - luabind ( spora, skomplikowana, korzystajaca z boosta, pokazujaca jakie rzeczy mozna "naprawde" w C++ stworzyc ;) ), lub oolua ( mniejsza, bez zaleznosci, prostsza z bardziej 'klasyczna' skladnia )


Offline cybergod

  • Użytkownik

# Październik 10, 2010, 09:26:38
Właśnie wcześniej próbowałem użyć luabind, ale miałem z tym problemy. Może mógłby ktoś napisać jakiś przykładowy kod z przykładową klasą i przeniesieniem jej funkcji do Lua?

Offline Barthap

  • Użytkownik
    • Mój blog

# Październik 10, 2010, 11:11:11
@up:
Kiedyś przypadkowo szukałem jakiegoś silnika do skryptów w lua, w googlach wpisałem chyba "Lua script engine" i chyba na codeproject.com piękny przykład luabinda znalazło. Jak znajdę to Ci napiszę.

//EDIT: Chyba już tego nie ma, na 100% kiedyś na codeproject.com było, teraz przeszukałem wszystko i nie znalazłem :(
http://www.codeproject.com/info/search.aspx?artkw=luabind&sbo=kw
« Ostatnia zmiana: Październik 10, 2010, 11:31:25 wysłana przez Barthap »

Offline vashpan

  • Użytkownik
    • Strona

# Październik 10, 2010, 11:29:17
Trzeba czytac dokumentacje.... Naprawde nie ma tutoriali do wszystkiego i nikt za raczke nie bedzie prowadzil, jezeli chce sie robic cos powaznego....

http://www.rasterbar.com/products/luabind/docs.html#binding-classes-to-lua

Offline nowofresh

  • Użytkownik

# Październik 10, 2010, 12:13:38
Ja pisałem w LUA.

Musisz poprostu poczytać manuala.

Offline cybergod

  • Użytkownik

# Październik 10, 2010, 14:08:10
Kiedy próbuję skompilować kod:
#include <iostream>
#include <conio.h>
#include <string>

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

#include <luabind/luabind.hpp>

lua_State *L;

void Test()
{
std::cout<<"TEST!";
}

void main()
{
L = lua_open();
luaL_openlibs(L);
luabind::open(L);
luabind::module(L)
[
luabind::def("Test",Test)
];
bool exit = false;
std::string cmd;
while(!exit)
{
std::cout<<">";
std::getline(std::cin,cmd);
if(cmd == "!exit")
{
exit = true;
}
else
{
dostring(L,cmd);
}
}
lua_close(L);
return;
To wywalają błędy:
Error 6 error LNK2001: unresolved external symbol "class luabind::adl::object __cdecl luabind::detail::make_function_aux(struct lua_State *,struct luabind::detail::function_object *)" (?make_function_aux@detail@luabind@@YA?AVobject@adl@2@PAUlua_State@@PAUfunction_object@12@@Z) main3.obj
Error 8 error LNK2001: unresolved external symbol "public: __thiscall luabind::detail::registration::registration(void)" (??0registration@detail@luabind@@QAE@XZ) main3.obj
Error 12 error LNK2001: unresolved external symbol "public: __thiscall luabind::module_::module_(struct lua_State *,char const *)" (??0module_@luabind@@QAE@PAUlua_State@@PBD@Z) main3.obj
Error 1 error LNK2001: unresolved external symbol "public: __thiscall luabind::scope::~scope(void)" (??1scope@luabind@@QAE@XZ) main3.obj
Error 2 error LNK2001: unresolved external symbol "public: __thiscall luabind::scope::scope(class std::auto_ptr<struct luabind::detail::registration>)" (??0scope@luabind@@QAE@V?$auto_ptr@Uregistration@detail@luabind@@@std@@@Z) main3.obj
Error 3 error LNK2001: unresolved external symbol "public: __thiscall luabind::scope::scope(struct luabind::scope const &)" (??0scope@luabind@@QAE@ABU01@@Z) main3.obj
Error 7 error LNK2001: unresolved external symbol "public: virtual __thiscall luabind::detail::registration::~registration(void)" (??1registration@detail@luabind@@UAE@XZ) main3.obj
Error 5 error LNK2001: unresolved external symbol "public: void __thiscall luabind::detail::invoke_context::format_error(struct lua_State *,struct luabind::detail::function_object const *)const " (?format_error@invoke_context@detail@luabind@@QBEXPAUlua_State@@PBUfunction_object@23@@Z) main3.obj
Error 11 error LNK2001: unresolved external symbol "public: void __thiscall luabind::module_::operator[](struct luabind::scope)" (??Amodule_@luabind@@QAEXUscope@1@@Z) main3.obj
Error 10 error LNK2001: unresolved external symbol "void __cdecl luabind::detail::add_overload(class luabind::adl::object const &,char const *,class luabind::adl::object const &)" (?add_overload@detail@luabind@@YAXABVobject@adl@2@PBD0@Z) main3.obj
Error 9 error LNK2001: unresolved external symbol "void __cdecl luabind::detail::handle_exception_aux(struct lua_State *)" (?handle_exception_aux@detail@luabind@@YAXPAUlua_State@@@Z) main3.obj
Error 4 error LNK2001: unresolved external symbol "void __cdecl luabind::open(struct lua_State *)" (?open@luabind@@YAXPAUlua_State@@@Z) main3.obj
Error 13 fatal error LNK1120: 12 unresolved externals E:\Programowanie\C++\Visual C++ 2008 EE\Nauka_lua\Release\Nauka_lua.exe
Mógłby ktoś mi pomóc i wyjaśnić jak je usunąć?

Offline Barthap

  • Użytkownik
    • Mój blog

# Październik 10, 2010, 15:24:57
a linkujesz biblioteki luabind?

Offline cybergod

  • Użytkownik

# Październik 10, 2010, 18:45:01
Nie, bo w paczce, którą ściągnąłem nie było żadnych libów. Jeżeli trzeba jakieś zlinkować, to prosiłbym o linka do nich.

Offline Dab

  • Redaktor
    • blog

# Październik 10, 2010, 18:46:14

Offline cybergod

  • Użytkownik

# Październik 10, 2010, 19:17:55
O Jezu! Wpisuję w google "luabind libs download" i klikam na pierwszy link. Pobieram plik i... Spróbuj znaleźć tam jakieś liby. Nie ma? To nie odpowiadaj mi linkiem do google tylko konkretnym linkiem do libów! Nie pytałbym, gdybym nie szukał w google.

Offline Dab

  • Redaktor
    • blog

# Październik 10, 2010, 19:24:18
W dawnych, dobrych czasach jak już ktoś ściągnął modemem te kilkadziesiąt kilobajtów to był w stanie chociaż otworzyć ściągnięty plik -- a takie nazwy jak README czy INSTALL stanowiły ciekawą lekturę na wiele godzin. Teraz, mamy Internet 100 mbps a pierwszym odruchem po ściągnięciu czegokolwiek jest polecenie z pyskiem na forum. Smutne.

Offline hfjh

  • Użytkownik

# Październik 10, 2010, 19:39:34
Dab, zapomniałeś dodać, że 'kiedyś to w ogóle było lepiej' ;)

@autor: musisz sobie sam skompilować.

Offline Barthap

  • Użytkownik
    • Mój blog

# Październik 10, 2010, 20:18:00
ta, stare dobre czasy.

Dziwne, bo ja kiedyś wpisywałem podobne hasło w googlach i jakoś wypluł mi link do strony z linkiem do paczki, w której był plik projektu visual studio, przykładowy program, headery i liby od boosta i luabinda.