2

LuaJava を使用して Java から単純な Lua 関数を呼び出そうとしています。calc.lua:

function foo(n) return n*2 end

以上が calc.lua にあるすべてであり、コマンド ラインからの後続の呼び出しが機能します。

常にエラーが発生する呼び出しは次のとおりです。

L.getGlobal("foo");     
L.pushNumber(8.0);
int retCode=L.pcall(1, 1,-2); // retCode value is always 5 pcall(numArgs,numRet,errHandler)
String s = L.toString(-1);     // s= "Error in Error Handling Code"


L.remove(-2);も試しました。L.insert(-2);

なぜエラーが発生するのか、またはエラーが何であるかはわかりません。エラーハンドラを正しく設定していないのでしょうか?それで、それは電話をかけませんか?ロード後、コンソールから試してみたところ、 print(foo(5)) を実行して期待どおりに 10 を取得できました。

更新: スタックにエラー ハンドラーを提供する必要があるようです。このようなエラー ハンドラーのシグネチャとは何か、またそれをスタック上のポイントに配置する方法を教えてください。ありがとう

4

2 に答える 2

1

これは、Luaリファレンスマニュアルから抜粋したものです。CAPIセクションの下に、 pcallについて次のように記載されています。

lua_callを使用して関数を呼び出すと、呼び出された関数内のエラーはすべて上方に伝播されます(longjmpを使用)。エラーを処理する必要がある場合は、lua_pcallを使用する必要があります。

  int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);

..。

errfuncが0の場合、返されるエラーメッセージは元のエラーメッセージとまったく同じです。それ以外の場合、errfuncはエラーハンドラ関数のスタックインデックスを提供します。(現在の実装では、そのインデックスを疑似インデックスにすることはできません。)ランタイムエラーの場合、その関数はエラーメッセージとともに呼び出され、その戻り値はlua_pcallによって返されるメッセージになります。

したがって、LuaJavaのAPIがC APIをミラーリングしていると仮定して、0を渡すだけで、特別なエラーがないことを示します。このようなものが機能するはずです:

int retCode = L.pcall(1, 1, 0);
String errstr = retCode ? L.toString(-1) : "";
于 2011-12-24T01:47:23.667 に答える
0

なぜあなたは-2を提供したのですか?それはあってはならないことです。Lua スタックには、インデックス -2 でエラーを処理するエラー関数が存在することを Lua に伝えましたが、コードはそのようなことを何も示していません。pcallほとんどの場合、2 つの引数のみを取る必要があります。

于 2011-12-23T23:25:42.730 に答える