2013-12-11 7 views
5

私はかなり長い間探してきましたが、C++からすべてのグローバル変数を取得する方法が見つかりませんでした。この小さなLuaテストスクリプトを考えてみましょう。C++のすべてのLuaグローバル変数をループします

myGlobal1 = "Global 1" 
myGlobal2 = 2 

function test() 
    local l1=0 
    print (myGlobal1,myGlobal2,l1) 
end 

test() 

は、あなたがprint (myGlobal1,myGlobal2,l1)時およびCからの実行を一時停止想定++すべてのグローバル変数(myGlobal1myGlobal2)を取得します。これらの例は任意ですが、C++の観点からのグローバル変数は不明です。

私はlua_getglobal()を見てきましたが、最初に変数の名前を知る必要があります。私はlua_getupvalue()を見たが、結果として「_ENV」しか得られなかった。

lua_getglobal()私はそれらの名前を知ってすぐに使えると思いますが、C++のグローバル変数のリストはどのように取得できますか?私は(それは任意のヘルプにある場合)、この時点でlua_Debug構造を持っています

EDIT この投稿もともとテーブルを反復処理については、それがユーザー自身のグローバルを見つける方法についてでしたいませんでした。

しかし、私はこれをどのようにして解決できるのかを投稿しましたhere

+3

...テーブルエントリの残りの部分から自分自身のグローバルを区別することです[これを使用](http://stackoverflow.com/questions/1438842/iterating-through-a-lua -table-from-c)グローバルが '_G'のインデックスであることを思い出してください。 –

+0

ルア5.1または5.2? –

+0

@Bartekしたがって、_Gを繰り返し実行すると、すべてのグローバル変数が得られますか? –

答えて

8

私はそれを解決しました。

lua_pushglobaltable(L);  // Get global table 
lua_pushnil(L);    // put a nil key on stack 
while (lua_next(L,-2) != 0) { // key(-1) is replaced by the next key(-1) in table(-2) 
    name = lua_tostring(L,-2); // Get key(-2) name 
    lua_pop(L,1);    // remove value(-1), now key on top at(-1) 
} 
lua_pop(L,1);     // remove global table(-1) 

lua_next()は、キーの名前が一番上にテーブルを残してポップされ(-1)以上のエントリを見つけることができません。

次の問題は、

+1

[manual](http://www.lua.org/manual/5.2/manual.html#lua_next)は次のように言っています: "テーブルをトラバースしている間、do 'lua_tolstring'が指定されたインデックスの値を変更するかもしれないことを思い出してください;これは' lua_next'への次の呼び出しを混乱させます。 "名前が文字列ではありませんが、それが起こる可能性があるグローバル変数を持つことはほとんどありません。 – lhf

+0

はい、私はそれを考え出しました。私はそれについて自分の投稿を編集するのを忘れました。私はグローバルをフィルタリングするためのより良い方法を見つけようとしています。 –

+0

グローバルの除外に関する別の質問をしてください。 – lhf

関連する問題