c에서 루아 함수 호출 후 리턴값..

336 views
Skip to first unread message

mik...@gmail.com

unread,
Jul 1, 2007, 3:53:31 AM7/1/07
to luausers-kr
c 코드에서 루아 함수를 호출한 후 해당 리턴값을 받으려고 합니다.

함수를 호출하는 가장 기본적인 방법은

lua_getglobal(lua_state, "함수명");
lua_pcall(lua_state, 0, -1, 0);[

이걸 들 수 있겠는데요, 의도한 대로 잘 동작합니다.

문제는 luaL_dostring을 사용할 때 입니다.
동작은 하는데 리턴값은 받아올 수 없더라구요.

어떻게 하면 리턴값을 받아올 수 있을까요?

그리고 추가 질문으로 처음 방법으로 루아 함수를 호출 할 때,
테이블에 저장된 함수(특히 클래스의 메쏘드)는 어떻게 호출 할 수 있을까요?

lua_getglobal(lua_state, "클래스명:함수명");

위 방식으로는 되지 않더라구요. 그래서 luaL_dostring을 쓰려고 하는 것이기도 하구요.

mika

unread,
Jul 1, 2007, 5:07:47 AM7/1/07
to luausers-kr
두번째 문제에 대한 자답입니다.

클래스의 메쏘드를 실행하는 것은 첫 인자로 클래스 자신을 넘겨주는 것과 같으므로 호출 전에 인자로 자기 자신을 푸쉬해주면 되네
요.

코드:
lua_getglobal(m_luaState, "클래스");
lua_getfield(m_luaState, -1, "메소드");
lua_pushvalue(m_luaState, -2);
lua_pcall(m_luaState, 1, -1, 0);

redpixel

unread,
Jul 1, 2007, 5:27:39 AM7/1/07
to luaus...@googlegroups.com
lauxlib.h에 보시면 다음과 같이 선언되어있습니다.
#define luaL_dostring(L, s) \
 (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
 
즉, 반환값이 잘 넘어오도록 되어있습니다. 단, 문자열 안이 함수내용처럼 작성되어있어야합니다. 루아는 luaL_loadstring 을 하면 스택에 일단 해당 문자열을 컴파일한 함수값을 넣게 됩니다. 이것을 인자없이 lua_pcall로 호출하는게 luaL_dostring이거든요. (위 코드 참조) 그러므로 문자열이 함수처럼 작성되어있으면 됩니다. 즉,
 
luaL_dostring(L, "test()");
 
이런식으로 실행하면 당연히 안되시고요.
 
luaL_dostring(L, "return test()");
 
이런식으로 하셔야합니다. 하지만 컴파일을 하고 실행한후 해당 함수값이 garbage가 되어버리므로 실행성능은 좀 떨어지죠. ^_^ 메인루프에서 이런 작업이 빈번히 일어나면 gc 설정을 적당히 조정해주는게 필요합니다.
 
lua.c를 보시면 lua_loadbuffer와 lua_pcall을 같이 쓰는 것을 보실수 있습니다. (docall과 dostring 함수 코드 참조)

 
07. 7. 1, mika <mik...@gmail.com>이(가) 작성:
--
Kwon Tai-in
   Senior Engineer
   GES Co.ltd. (http://www.iges.co.kr)
home: http://www.redwiki.net
PGPkey: http://keyserver.veridis.com:11371/export?id=-5789970709130555655&created=1143603649000
PGPKeyID: 0x0E5B4EF9
MSN,GTalk ID : redwi...@gmail.com

mika

unread,
Jul 1, 2007, 5:59:29 AM7/1/07
to luausers-kr
우오오오오~~ 그런 문제가 있었군요!

답변 정말 감사드립니다. ㅜㅇㅜ
오늘 퇴근 못 할뻔 했는데 이제 가뿐한 마음으로 퇴근할 수 있겠네요. ^^;;;

redpixel

unread,
Jul 1, 2007, 6:09:03 AM7/1/07
to luaus...@googlegroups.com
다행입니다. 오늘 일요일인데 아직까지 고생이신가봐요. 저도 그런데.. -_ㅜ 얼마 안남은 주말 잘 보내시길 바랍니다. ^_^

07. 7. 1, mika <mik...@gmail.com>이(가) 작성:
우오오오오~~ 그런 문제가 있었군요!


답변 정말 감사드립니다. ㅜㅇㅜ
오늘 퇴근 못 할뻔 했는데 이제 가뿐한 마음으로 퇴근할 수 있겠네요. ^^;;;



Reply all
Reply to author
Forward
0 new messages