2

LuaCAPIの使用に問題があります。pcall(C API関数)が失敗すると、エラーはスタックにプッシュされます。 lua_tostringはスタックにエラーをlua_gettop示していますが、はスタックが空であることを示しています。

#include <lua5.2/lauxlib.h>
#include <lua5.2/lua.h>
#include <lua5.2/lualib.h>

int main()
{
    lua_State *L = luaL_newstate();
    lua_pcall(L, 0, 0, 0);
    printf("%d\n", lua_gettop(L)); // outputs 0, indicating empty stack
    printf("%s\n", lua_tostring(L, -1)); // outputs "attempt to call a nil value", indicating non-empty stack
}

コンパイル:gcc main.c `pkg-config --cflags lua5.2`` pkg-config --libs lua5.2`

このプログラムの表示:0はnil値を呼び出そうとします

lua_gettop(L)はスタックサイズを返します。ここで0を取得します。空のスタックから文字列を取得するにはどうすればよいですか?

The behavior is the same with the 5.1 version.

4

2 に答える 2

1

これはLuaメーリングリストで回答されています。動作は正しいです。関数を呼び出すには、関数をスタックにプッシュする必要があります。後のスタックluaL_newstateは空です。

編集: OPは「空のスタックから文字列を取得するにはどうすればよいですか?」と述べました。私の答えは次のとおりです。0が返されてから空であることがわかっているのに、なぜ空のスタックから何かを取得したいのですか?lua_gettop

結論:

  • を呼び出す前にスタックが空でしたlua_pcall。これはエラーです。ルアは回復しましたが、あなたはそれを当てにすることはできません。
  • 後のスタックは空でしたlua_pcall。ルアはそう考えて、を介してあなたにそう言いますlua_gettop
  • 空のスタックから値を取得しようとしないでください。印刷される文字列は、によって残されたゴミlua_pcallですが、期待することはできません。
于 2012-05-15T18:36:36.857 に答える
0

私の知る限り、lua_pcall はエラー文字列をプッシュしません。代わりに、スタックの一番上にある値を上書きします (少なくともそこには常に関数があるはずなので ;p)。したがって、 lua_pcall (または、より正確には、debug.traceback だと思います) は、スタック ポインターを変更せずに、やみくもにスタックの先頭を上書きします。

したがって、lua_pcall が戻ると、値はスタックの一番上にありますが、スタック ポインターはスタックが空であることを示します (lua_pcall を呼び出したときのように)。

これは、より深刻なエラーを回避するための手段であると思います (たとえば、メモリの破損やメモリ不足のエラーが発生した場合、エラー メッセージ用にこれ以上のスタック スペースを割り当てたくないでしょう?)。

于 2012-05-26T18:11:59.797 に答える