CからLuaを呼び出す

私はCからユーザ定義のLua関数を呼び出そうとしています。これについていくつかの議論がありましたが、その解決法は明らかです。私はluaL_ref()で関数のインデックスを取得し、後で使用するために返されたインデックスを保存する必要があります。

私の場合、luaL_refで値を保存しました。私は、CコードがluaL_refで保存されたLua関数を呼び出す必要があるところにいます。そのために、私は次のようにlua_rawgetiを使用しています:

lua_rawgeti(l, LUA_REGISTRYINDEX, fIndex);

これにより、lua_rawgetiにクラッシュが発生します。

私が使用しているfIndexはluaL_refから受け取った値なので、ここで何が起こっているのか分かりません。

編集:

私は次のようにLuaスクリプトを実行しています:

function errorFunc()
  print("Error")
end

function savedFunc()
  print("Saved")
end

mylib.save(savedFunc, errorFunc)

私は自分のLuaライブラリ 'mylib'をCの関数で定義しました:

static int save(lua_State *L) 
{
    int cIdx = myCIndex = luaL_ref(L, LUA_REGISTRYINDEX);
    int eIdx = luaL_ref(L, LUA_REGISTRYINDEX);

私はcIdxとeIdxを離れて、私がLuaスクリプトのパラメータとして設定した関数の1つを呼び出したい外部イベントを受け取った後の時点まで保存します。ここでは(同じスレッド上で、同じlua_State *を使用して)、私は以下を呼び出します:

lua_rawgeti(L, LUA_REGISTRYINDEX, myCIndex);

それはクラッシュを引き起こしている。

3
私がlua_close(L)を呼び出した後、私がlua_rawgetiと呼んでいたポイントが実行されていたことが問題だったようです。
追加された 著者 jimt,
これに答えるためには、呼び出すしようとしている「ユーザ定義のLua関数」がどこにあるのか、そしてこれをレジストリにどのように格納するのかを調べる必要があります。
追加された 著者 Nicol Bolas,
lua_close(L)を呼び出した後、lua_State LにLua C APIを使用しないでください。
追加された 著者 Oliver,
@jimt私は自問自答や削除を提案し、質問は開いたままではありません。
追加された 著者 BMitch,

2 答え

@Scholliiが述べたように、私はlua_close(L)を実行した後にこの呼び出しを行っていました。

0
追加された

私の最初の提案は、C言語で関数を保存せずに動作させることです。 Luaのグローバルに関数を割り当て、次にC言語でLua状態(L)を使用してグローバルを取得し、argsをプッシュして関数を呼び出し、結果を使用します。それがうまくいけば、基本がわかり、機能が動作していることを知っているので、関数を使ってレジストリを使う方法を変えることができます。がんばろう!

0
追加された
コメントを読むと、状態を使って終了する前に lua_close というジムが表示されます。
追加された 著者 BMitch,