1

関数がグローバルテーブルのサブテーブルにある C++ から lua 関数を呼び出そうとしています。ソースからコンパイルされた lua バージョン 5.2.* を使用しています。

ルア関数

function globaltable.subtable.hello()
 -- do stuff here
end

C++ コード

lua_getglobal(L, "globaltable");
lua_getfield(L, -1, "subtable");
lua_getfield(L, -1, "hello");
if(!lua_isfunction(L,-1)) return;
    lua_pushnumber(L, x);
    lua_pushnumber(L, y);
    lua_call(L, 2, 0);

ただし、呼び出すことができません。常にエラーが発生します

パニック: Lua API の呼び出しで保護されていないエラーが発生しました (nil 値のインデックスを作成しようとしました)

3 行目: lua_getfield(L, -1, "hello");

私は何が欠けていますか?

副次的な質問: globaltable.subtable.subsubtable.hello()などのように、これよりも深い関数を呼び出す方法も知りたいです。

ありがとうございました!


これは、グローバルテーブルを作成するために使用しているものです。

int lib_id;
lua_createtable(L, 0, 0);
lib_id = lua_gettop(L);
luaL_newmetatable(L, "globaltable");
lua_setmetatable(L, lib_id);
lua_setglobal(L, "globaltable");

globaltable.subtable を作成するにはどうすればよいですか?

4

2 に答える 2

2

functionはLuaのキーワードです。どうやってコードをコンパイルしたのか推測しています:

-- test.lua
globaltable = { subtable = {} }
function globaltable.subtable.function()
end

これを実行すると:

$ lua test.lua
lua: test.lua:2: '<name>' expected near 'function'

このオンライン プレゼンテーションの識別子を変更した可能 性がありますが、3 行目ではスタックの最上位が既に であるため、 2 行目"subtable"が実際に に存在することを確認してください。globaltablenil

アップデート:

複数レベルのテーブルを作成するには、次の方法を使用できます。

lua_createtable(L,0,0); // the globaltable
lua_createtable(L,0,0); // the subtable
lua_pushcfunction(L, somefunction);
lua_setfield(L, -2, "somefunction"); // set subtable.somefunction
lua_setfield(L, -2, "subtable");     // set globaltable.subtable
于 2012-07-14T09:20:29.870 に答える
0
lua_newtable(L);
luaL_newmetatable(L, "globaltable");
lua_newtable(L); //Create table
lua_setfield(L, -2, "subtable"); //Set table as field of "globaltable"
lua_setglobal(L, "globaltable");

これは私が探していたものです。

于 2012-07-15T10:09:42.270 に答える