2009-08-01 37 views
9

誰でも、lua_pop()関数をC++で正しく使う方法を教えてもらえますか?lua_pop()関数の使い方は?

  • lua_get *()関数を使用するといいでしょうか?好き。

    lua_getglobal(L、 "something");

    lua_pop(L、1);

またはどのように使用するのですか?ガベージコレクタはしきい値を超えてこれらの情報をクリアしますか?ありがとう。

答えて

20

lua_pop()に電話すると、Luaスタックからアイテムを削除できます。シンプルな関数では、コアが戻り値を処理する際にスタックをクリーンアップするので、これはまったく不要です。

より複雑な関数、特にLuaを呼び出すCコードの場合、スタックが無限に成長するのを防ぐために、スタックから物をポップする必要があります。

lua_getglobal()関数は、呼び出されたときにスタックに1つの項目を追加します。グローバルが存在しない場合はnil、名前付きグローバル変数の値は1つです。その値のコピーをスタックに置くことは、それがガベージコレクタから保護されている限り、その値をガードコレクタから保護します。グローバルが変更された場合、スタック上のコピーが残っている唯一の参照である可能性があるため、その値はスタックを検索したCコードが使用している限りスタックに残る必要があります。 lua_tostring()によって返されたポインタが唯一であることが保証されているので、私は、文字列の内容をコピーするように注意しています、

void doMyEvent(lua_State *L) { 
    lua_getglobal(L, "MyEvent"); 
    lua_call(L, 0, 0); /* pops the function and 0 parameters, pushes 0 results */ 
} 

double getGlobalDouble(lua_State *L, const char *name) { 
    double d; 
    lua_getglobal(L,name); 
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */ 
    lua_pop(L,1);   /* pop the value to leave stack balanced */ 
    return d; 
} 

char *copyGlobalString(lua_State *L, const char *name) { 
    char *s = NULL; 
    lua_getglobal(L,name); 
    if (!lua_isnil(L,-1)) 
     s = strdup(lua_tostring(L,-1)); 
    lua_pop(L,1); 
    return s; 
} 

最後の例では:

だからグローバルを使用するための一般的なパターンは、これらのようなものです値がスタックに残っている限り有効です。これには、copyGlobalString()の発信者が後でfree()を呼び出す必要があります。

Lua manualの最近のエディションには、消費されたスタックエントリの数とプッシュされた番号を識別する表記法が各機能とともに含まれています。これにより予期しないスタックの増加を防ぐことができます。

+0

+1、LuaのコメントスタイルはC++コードですか? :-) –

+1

@nick ... facepalm!その良い今;-) – RBerteig

+0

ちょっと!助けてくれてありがとう。もう1つの質問ですが、lua_call(L、0、0)を呼び出すことの違いは何ですか? lua_pop(L、1);機能を削除するために??私はlua_pop(L、1)を使用するのではなく、なぜlua_call(L、0、0)を使用したのでしょうか? – Morpheus