2012-08-27 2 views
4

함수 멤버로 C 함수를 푸시하거나 루아 함수로 C 함수를 등록하는 데 아무런 문제가 없습니다 lua_register (L, lua_func_name, c_func); 루아 함수를 C API에서 테이블 멤버로 푸시

하지만 내가 어떻게 C에서 "foober"에 대한 기능 콜백 PARAM로 luaFoo()를 전달하려는 것을 루아에게? lua_pushcfunction - C 함수를 푸시합니다. lua_pushstring은 일반 문자열을 푸시하므로 콜백 필드는 함수가 아닌 문자열이됩니다.

루아 코드 :

CALLBACKS = {}; 
FOO = 0; 

function luaFoo() 
FOO = FOO + 1; 
end; 

function addCallback(_name, _callback) 
CALLBACKS[_name] = _callback; 
end; 

function doCallback(_name) 
CALLBACKS[_name](); 
end; 

C 코드 :

static int c_foo(lua_State* l) 
{ 
    printf("FOO\n"); 
    return 0; 
} 

/*load lua script*/; 
lua_State* l = /*get lua state*/; 
lua_getglobal(l, "addCallback"); 
lua_pushstring(l, "foober"); 
//What push for luaFoo() 
lua_pushcfunction(l, c_foo); 
lua_call(l, 2, 0); 

lua_getglobal(l, "doCallback"); 
lua_pushstring(l, "foober"); 
lua_call(l, 1, 0); 

비슷한 - 난 이미 C. 우리의 콜백 PARAM로 전달하는 방법 lua_register에 등록 C 함수를 얻는 경우 register c_foo => c_foo가 루아 함수로 존재하며, "c_foo"을 콜백 함수 param으로 전달할 방법을 알려주는 방법.

답변

6

것을 기억

function luaFoo() 
    ... 
end 

루아,이하는 것과 같습니다

따라서
luaFoo = function() 
    ... 
end 

, 당신의 질문은 궁극적으로 귀결, "나는 어떻게 글로벌 테이블에 값을 가지고있다. 스택에 밀어 넣을까요? " 이 값이 함수라는 사실은 과 관련이 없습니다.; 루아의 함수 값은 정수 값과 다르지 않으며 문자열 값과 다르지 않습니다. 분명히 당신은 을 그들과 다른 것들을 할 수 있습니다,하지만 당신은 그걸 복사하고 싶을뿐입니다. 가치가 무엇이든 관계없이 똑같이 작동합니다.

원하는 기능은 lua_getglobal입니다.

두 번째 질문에 대해서는 두 가지 방법 중 하나로 할 수 있습니다. 전역 테이블에서 등록한 함수 값을 얻거나 간단하게 lua_pushcfunction으로 다시 등록 할 수 있습니다. upvalues를 사용하지 않으므로 다시 등록하면 단점이 없습니다.

아, 코드 스타일에서 한 가지 더. 루아는 문장의 끝에 ;을 요구하지 않습니다. C- 네이티브 프로그래머가 편안함을 느낄 수 있도록 할 수는 있지만 필수는 아닙니다.

관련 문제