1

lua_settop()のドキュメントは非常に明確だと思いました。

void lua_settop(lua_State * L、int index);

受け入れ可能なインデックスまたは0を受け入れ、スタックトップをこのインデックスに設定します。新しいトップが古いトップよりも大きい場合、新しい要素はnilで埋められます。インデックスが0の場合、すべてのスタック要素が削除されます。

...それでも、このコード:

lua_settop(L, 0);
top = lua_gettop(L);
if (lua_isnoneornil(L, top)) {
  printf("Invalid stack (nil)");
}
else {
  // WTF?
  printf("? %d -> %s", top, lua_typename(L, lua_type(L, top)));
}

収量:

? 0 -> table

何が得られますか?

スタックが空かどうかを確認するにはどうすればよいですか?(lua_gettop(L)== 0)を使用していますか?

もしそうなら、なぜlua_isnone()呼び出しさえあるのですか?

4

2 に答える 2

5

あなたの質問は、以下のドキュメントによって簡単に答えられますlua_gettop

スタックの最上位要素のインデックスを返します。インデックスは1から始まるため、この結果はスタック内の要素の数に等しくなります(したがって、0は空のスタックを意味します)。

于 2012-06-14T09:15:28.450 に答える
1

この質問に出くわした他の人のための参考のために、この質問に対する他の答えは、luaドキュメントからです:

ほとんどのクエリ関数は、使用可能なスタックスペース内の任意の値、つまり、lua_checkstackで設定した最大スタックサイズまでのインデックスをインデックスとして受け入れます。このような指標は、許容可能な指標と呼ばれます。より正式には、許容可能なインデックスを次のように定義します。

 (index < 0 && abs(index) <= top) ||
 (index > 0 && index <= stackspace)

0は決して受け入れ可能なインデックスではないことに注意してください。

lau_gettop()が0を返す場合、0は受け入れ可能なインデックスではないため、is_none()およびisnoneornil()を呼び出すことはできません。

于 2012-06-15T06:49:09.800 に答える