2013-12-10 6 views
5

저는 Google을 최고로 낮게 책망하고 있지만 예제는 있지만 아무 것도 작동하지 않는 것 같습니다 (루아 5.2). C++에서 Lua 함수를 호출하십시오.

은 내가 C++에서 onData를 호출 할
function onData (data) 
    print (data) 
end 

루아

의 간단한 기능을 가지고이 시도 :

// Create new Lua state 
L = luaL_newstate(); 

// Load all Lua libraries 
luaL_openlibs(L); 

// Create co-routine 
CO = lua_newthread(L); 

// Load and compile script 
AnsiString script(Frame->Script_Edit->Text); 
if (luaL_loadbuffer(CO,script.c_str(),script.Length(),AnsiString(Name).c_str()) == LUA_OK) { 
    Compiled = true; 
} else { 
    cs_error(CO, "Compiler error: "); // Print compiler error 
    Compiled = false; 
} 


// Script compiled and ready? 
if (Compiled == true) { 
    lua_getglobal(CO, "onData"); // <-------- Doesn't find the function 
    if(!lua_isfunction(CO,-1)) { 
    lua_pop(CO,1); 
    return; 
    } 
    lua_pushlstring(CO,data,len); 
    lua_resume(CO,NULL,0) 
} 

을 당신은 내가이 공동으로 내 스크립트를 시작하고 볼 수 있듯이 루틴 그래서 나는 그것에 lua_yield() 함수를 사용할 수 있습니다. 나는 LCO 상태 모두에서 함수를 찾으려고 노력했다.

답변

4

luaL_loadbuffer은 스크립트를로드하지만 실행하지는 않습니다. onData은 스크립트 실행시에만 정의됩니다.

luaL_loadbuffer 대신 luaL_dostring 번으로 전화 해보세요.

앞에 lua_pcall(CO,0,0,0)을 추가하십시오.

dataonData으로 전달하려면 lua_resume(CO,NULL,1)이 필요합니다.

+0

하지만 lua_loadbuffer()는 스크립트를 컴파일하여 실행을 위해 스택에 배치하므로 알려야합니다. luaL_dostring()은 스택을 청크로 만든 후에 스크립트를 컴파일하고 실행합니다. 보시다시피 lua_yield() 함수를 사용할 수 있도록 lua_resume을 사용해야합니다. 스크립트를 먼저 실행하면 원하는 함수 이외의 다른 코드도 실행됩니다. 나는 그 기능 만 실행하고 싶지 않다. –

+2

@MaxKielland lhf는 Lua의 제작자 중 한 명입니다. 그는 아마도 그가 무슨 말을하는지 잘 알고있을 것입니다. 그래서 나는 실제로 그의 제안을 시도하고 그것이 효과가 있는지보기를 제안한다. –

+0

@MaxKielland, onData를 정의하려면 스크립트를 실행해야합니다. 또한'data'를'onData'에 전달하기 위해서는'lua_resume (CO, NULL, 1)'이 필요합니다. – lhf