2013-12-11 4 views
5

Я искал довольно долгое время, и я не нашел способ получить все глобальные переменные из C++. Рассмотрим этот небольшой сценарий тестирования Lua.Цикл всех глобальных переменных Lua в C++

myGlobal1 = "Global 1" 
myGlobal2 = 2 

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

test() 

Предположим, вы приостановите выполнение в print (myGlobal1,myGlobal2,l1) и от C++ получить все глобальные переменные (myGlobal1 и myGlobal2). Эти примеры произвольны, глобальные переменные, с точки зрения 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

Lua 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) гласит: «Проезжая таблицу, сделайте не вызывайте 'lua_tolstring' непосредственно на ключ, если только вы не знаете, что ключ на самом деле является строкой. Вспомните, что' lua_tolstring' может изменить значение по данному индексу, что смущает следующий вызов 'lua_next'.". Маловероятно, что у вас будет глобальная переменная, имя которой не является строкой, но это может произойти. – lhf

+0

Да, я понял это. Я забыл изменить свой пост. Я пытаюсь найти лучший способ отфильтровать мои глобальные переменные. –

+0

Задайте отдельный вопрос об отфильтровывании ваших глобальных переменных. – lhf

Смежные вопросы