Warsztat.GD

Programowanie => Szkółka => Wątek zaczęty przez: cybergod w Październik 09, 2010, 20:55:01

Tytuł: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: cybergod w 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.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: hfjh w 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.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: vashpan w 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 )

Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: cybergod w 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?
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: Barthap w 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
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: vashpan w 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
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: nowofresh w Październik 10, 2010, 12:13:38
Ja pisałem w LUA.

Musisz poprostu poczytać manuala.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: cybergod w 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ąć?
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: Barthap w Październik 10, 2010, 15:24:57
a linkujesz biblioteki luabind?
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: cybergod w 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.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: Dab w Październik 10, 2010, 18:46:14
Proszę: www.google.com
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: cybergod w 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.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: Dab w 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.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: hfjh w 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ć.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: Barthap w 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.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: cybergod w Październik 10, 2010, 21:23:30
Znalazłem liby do starszej wersji 0.8 i podczas kompilacji wywalają 2 błędy podobne do tych z poprzedniego posta. Szukałem w googlach kodu źródłowego do kompilacji, ale nic nie znalazłem. Prosiłbym o LINKI DO KODU ŹRÓDŁOWEGO LUABIND W WERSJI 0.9 LUB 0.9.1 DLA VC 2008, A NIE DO GOOGLE. Poza tym odpowiadanie zdaniem typu "szukaj w google", albo linkiem do google jest chamskie i na pewno chodziło o nabicie postów, a nie o pomoc. Równie dobrze można w każdym nowym poście na forum odpowiadać "szukaj w google". Forum jest po to, aby POMAGAĆ ludziom, a nie odsyłać do google. W przyszłości ktoś może mieć ten sam problem i jedyne co znajdzie w wynikach wyszukiwania to posty na forach właśnie o treści "szukaj w google". I co ma wtedy zrobić? Może jedynie wchodzić na kolejne strony i po raz kolejny widzieć post "szukaj w google".
Kiedyś przynajmniej ludzie pomagali, a teraz tylko odsyłają do google.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: radsun w Październik 10, 2010, 22:47:43
http://sourceforge.net/projects/luabind/files/luabind/0.9.1/luabind-0.9.1.zip/download (http://sourceforge.net/projects/luabind/files/luabind/0.9.1/luabind-0.9.1.zip/download)

Cytat: wikipedia.pl
Forum dyskusyjne to przeniesiona do struktury stron WWW forma grup dyskusyjnych, która służy do wymiany informacji i poglądów między osobami o podobnych zainteresowaniach przy użyciu przeglądarki internetowej.
Tytuł: Odp: [Lua i C++] Przenoszenie niestatycznej funkcji C++ do Lua
Wiadomość wysłana przez: lethern w Październik 10, 2010, 23:30:44
Po prostu ktoś musi za Ciebie tego poszukać, posprawdzać, i wkleić linka. Równie dobrze Ty możesz to zrobić. Po prostu Dab dał Ci do zrozumienia, że marnujesz czas ludzi z forum, którzy robią coś za Ciebie i jeszcze nic z tego nie mają. I jeszcze to narzekanie..