2016-08-04 8 views
2

私はLuaのエキスパートではありませんが、どのように動作するのかを理解するためにいくつかの記事があります。しかし、私はC++のテーブルに属するlua関数を呼び出すことに問題があります。Lua - C++インテグレーション:C++のテーブルの関数を呼び出す

以下の例では、コードからfoo:barを呼び出そうとしています。呼び出しは成功しました。しかし、パラメータ "a"はnilです(戻り値は正しいです - 戻り値を例10に変更すると正しい結果が表示されます)

スクリプトへの関数の引数の入力中に何かを逃しましたか?

lua_State* state = LuaIntegration->GetLuaState(); 
lua_getglobal(state, "foo"); 
if(lua_istable(state, lua_gettop(state))) { 
    lua_getfield(state, -1, "bar"); 
    if(lua_isfunction(state, lua_gettop(state))) { 
     lua_pushinteger(state, 0); 
     if (lua_pcall(state, 1, 1, 0) != 0) { 
      ErrorMessage = lua_tostring(state, -1); 
     } 
     ReturnValue = lua_tointeger(state, -1); 
    } 
} 

これは、LUAで関数を呼び出します。

foo = base_foo:new() 

function foo:new(o) 
     o = o or {} 
     setmetatable(o, self) 
     self.__index = self 
     return o 
end 

function foo:bar(a) 
    if a==10 then 
    return a 
    end 
    return 0 
end 

答えて

3

あなたがC++の呼び出しで砂糖を忘れてしまいました。

あなたがlua manualFunction Callsセクションを読めば、あなたがそのvは一度だけ評価されることを除いて

コールv:name(args)は、v.name(v,args)ためのシンタックスシュガーであることがわかります。

つまり、base_foo:new()は実際にはbase_foo.new(base_foo)です。

これは、あなたのC++呼び出しで欠けているものです。

テーブルを呼び出すときに関数の最初の引数としてテーブルを渡す必要があります。

+0

ああ意味があります。ありがとうございました –

関連する問題