사용자 도구

사이트 도구


kb:luaapifunction

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:luaapifunction [2014/11/07 10:03] (현재)
줄 1: 줄 1:
 +====== LuaApi/​Function ======
 +함수 다루기
 +
 +===== lua_call =====
 +<code cpp>
 +void lua_call (lua_State *L, int nargs, int nresults);
 +</​code>​
 +루아 함수를 호출한다. nargs는 함수 호출시 같이 주어지는 인자의 갯수이고,​ nresults는 해당하는 함수가 반환하는 반환값의 갯수이다. 함수 호출 이전에 함수 자체와 인수들을 스택에 푸쉬해 놓아야 한다.
 +
 +//2개의 인자를 가지고, 1개의 반환값을 가지는 함수 호출 예제//
 +<code cpp>
 +lua_State* L = ...
 +
 +lua_getglobal(L,​ "​some_function_name"​);​
 +lua_pushnumber(L,​ arg1);
 +lua_pushnumber(L,​ arg2);
 +
 +if (lua_call(L,​ 2, 1) != 0)
 +{
 +    // need error handling here
 +    ...
 +}
 +
 +int result = (int)lua_tonumber(L,​ -1);
 +lua_pop(L, 1);
 +</​code>​
 +<​code>​
 +호출 전의 스택 ​                      ​호출 후의 스택
 ++---------+
 +|  arg2   |
 ++---------+
 +|  arg1   |
 ++---------+ ​                         +---------+
 +|  func   ​| ​                         | retval ​ |
 ++---------+ ​                         +---------+
 +|   ​... ​  ​| ​                         |   ​... ​  |
 ++---------+ ​                         +---------+
 +</​code>​
 +
 +===== lua_pcall =====
 +<code cpp>
 +int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
 +</​code>​
 +루아 함수를 호출한다. lua_call 함수와 마찬가지로 nargs는 함수 호출시 같이 주어지는 인자의 갯수이고,​ nresults는 해당하는 함수가 반환하는 반환값의 갯수이다. 함수 호출 이전에 함수 자체와 인수들을 스택에 푸쉬해 놓아야 하는 점도 같다.
 +
 +단 하나 틀린 점은 해당 함수를 실행하다가 에러가 발생한 경우, 실행할 함수를 지정할 수 있다는 점이다. 마지막 인수인 errfunc 값이 에러 처리 함수의 스택 인덱스이다. 에러 처리 함수를 지정하기 싫다면 그냥 0을 주면 된다.
 +
 +//2개의 인자를 가지고, 1개의 반환값을 가지는 함수 호출 예제//
 +<code cpp>
 +lua_State* L = ...
 +
 +lua_getglobal(L,​ "​some_function_name"​);​
 +
 +int errorfunc = lua_gettop(L);​ // 현재 스택의 꼭대기, 즉 방금 집어넣은 함수의 스택 인덱스를 가져온다.
 +lua_getglobal(L,​ "​_TRACEBACK"​);​ // _TRACEBACK은 전역 함수로서 콜스택을 출력하는 함수다.
 +lua_insert(L,​ errorfunc); // 호출하고자하는 함수 밑에다 _TRACEBACK 함수를 집어넣는다.
 +
 +lua_pushnumber(L,​ arg1);
 +lua_pushnumber(L,​ arg2);
 +
 +if (lua_pcall(L,​ 2, 1, errorfunc) != 0)
 +{
 +    // 에러가 발생한 경우, _TRACEBACK 함수가 호출된다. ​
 +    // 이 함수는 현재 콜스택을 스택의 제일 위에다 문자열로서 푸쉬한다.
 +    string errormsg = lua_tostring(L,​ -1);
 +    ...
 +}
 +
 +int result = (int)lua_tonumber(L,​ -1);
 +lua_pop(L, 1);
 +</​code>​
 +<​code>​
 +호출 전의 스택 ​                      ​호출 후의 스택
 ++---------+
 +|  arg2   |
 ++---------+
 +|  arg1   |
 ++---------+ ​                         +---------+
 +|  func   ​| ​                         | retval ​ |
 ++---------+ ​                         +---------+
 +| errfunc |                          | errfunc |
 ++---------+ ​                         +---------+
 +</​code>​
 +주의할 점이 하나 있는데, 스택 모양에서도 알 수 있듯이 에러 처리 함수는 스택에서 제거되지 않는다. 그러므로 함수를 지정했다면,​ 반드시 이에 대한 처리를 해줘야한다. 위의 예에서는 호출할 함수 바로 밑에다 에러 처리 함수를 집어넣었으므로,​ 리턴값을 뽑아낸 다음, 에러 처리 함수를 뽑아내면 된다.
 +<code cpp>
 +int result = (int)lua_tonumber(L,​ -1);
 +lua_pop(L, 1);
 +lua_pop(L, 1); // 에러 처리 함수를 제거한다.
 +</​code>​
 +
 +===== lua_cpcall =====
 +<code cpp>
 +int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
 +</​code>​
 +
 +
 +===== lua_pushcclosure =====
 +<code cpp>
 +void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
 +</​code>​
 +
 +----
 +  * see also [[LuaApi]]
  
kb/luaapifunction.txt · 마지막으로 수정됨: 2014/11/07 10:03 (바깥 편집)