2010-11-09 127 views
0
//c++ funciton definition 
int LS_SomeFucntion(LuaState* state) 
{ 
LuaStack args(state); 
//.. 
set<int>::iterator it = mySet.begin(); 
for(; it != mySet.end(); ++it) 
{ 
    state.pushInteger(*it); 
} 
return mySet.size(); 

} 

state->GetGlobals().Register("SomeFunction",LS_SomeFunction); 

//lua scripts 
??? = SomeFunction() 

如何在lua腳本中獲取SomeFunction()的返回值 當大小不知道函數何時被調用?如何從lua腳本調用C++時獲得多個返回值?

+0

看來你不使用標準的C API for Lua。你使用的是什麼C++綁定? – 2010-11-09 05:21:57

+0

@Jesse:LuaPlus – Kim 2010-11-09 05:27:34

回答

4

您可以捕捉表中的所有返回值:

local rv = { SomeFunction() } 

print('SomeFunction returned', #rv, 'values') 
for i,val in ipairs(rv) do 
    print(i,val) 

或使用可變參數列表對其進行處理:

function DoSomething(...) 
    local nargs = select('#', ...) 
    print('Received', nargs, 'arguments') 
    for i=1,nargs do 
     print(i,select(i,...)) 
end 

DoSomething(SomeFunction()) 

當然,你的C函數應該可能只是返回一個Lua包含列表項的表。我不熟悉的LuaPlus,但是從文檔here來看,你會想是這樣的:

int LS_SomeFunction(LuaState* state) 
{ 
    LuaObject table; 
    table.AssignNewTable(state, mySet.size()); // presize the array portion 

    int i = 1; 
    for(set<int>::iterator it = mySet.begin(); it != mySet.end(); ++it) 
     table.SetNumber(i++, *it); 

    table.PushStack(); 
    return 1; 
} 

然後你只需要說:

local rv = SomeFunction() 
print('SomeFunction returned', #rv, 'values') 
+0

對我來說是正確的。 – 2010-11-09 05:57:24