5

C関数を関数メンバーとしてプッシュしたり、C関数をlua関数としてlua_register(L、lua_func_name、c_func);で登録したりしても問題はありません。

しかし、Cからの「foober」の関数コールバックパラメータとしてluaFoo()を渡したいものをluaにどのように伝えますか?lua_pushcfunction-C関数をプッシュし、lua_pushstringはプレーンな文字列のみをプッシュするため、コールバックフィールドは関数ではなく文字列になりました。

Luaコード:

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);

類似-すでにlua_registerに登録されているC関数を取得した場合、それらをCからコールバックパラメーターとして渡す方法。c_foo => c_fooがlua関数として存在することを登録し、 「c_foo」をコールバック関数パラメーターとして渡す方法を指定します。

4

1 に答える 1

6

覚えておいてください:

function luaFoo()
  ...
end

Luaではこれと同等です:

luaFoo = function()
  ...
end

したがって、あなたの質問は最終的に「グローバルテーブルに値があります。それをスタックにプッシュするにはどうすればよいですか?」ということになります。この値が関数であるという事実は関係ありません。Luaの関数値は、文字列値と同じである整数値と同じです。明らかに、それらを使ってさまざまなことを行うことができますが、それらをコピーしたいだけです。これは、値が何であるかに関係なく同じように機能します。

あなたが探している関数はですlua_getglobal

2番目の質問については、2つの方法のいずれかで行うことができます。登録した関数値をグローバルテーブルから取得するか、またはで再登録することができますlua_pushcfunction。アップバリューを使用していないので、再登録しても実際にはデメリットはありません。

ああ、そしてもう1つ、コードスタイルについてです。;Luaはステートメントの最後に必要ありません。(Cネイティブプログラマーがより快適に感じるようにするために)それを行うことはできますが、必須ではありません。

于 2012-08-27T08:03:06.113 に答える