Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lua

Войти
Регистрация
Восстановить пароль
 
VY
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 5
#1

Получить таблицу Lua С++ - Lua

27.07.2017, 15:22. Просмотров 396. Ответов 7
Метки нет (Все метки)

Добрый день!
Есть Lua скрипт торгового терминала Quik, в котором вызывается функция
getQuoteLevel2 (class_code, sec_code), - здесь class_code, sec_code – параметры (string)
Данная функция возвращает таблицу. Первые два поля которой, - это bid_count и offer_count (значения типа string).
А следующие два поля являются таблицами. Это таблицы bid и offer. Каждая таблица имеет по два столбца price и quantity.
Поля bid_count и offer_count это количество строк в соответствующих таблицах bid и offer.
Т.е. функция getQuoteLevel2 возвращает таблицу Lua со следующей структурой:

Функция возвращает таблицу Lua с параметрами:
Параметр Тип Описание
bid_count STRING Количество котировок покупки
offer_count STRING Количество котировок продажи
bid TABLE Котировки спроса (покупки)
offer TABLE Котировки предложений (продажи)
Таблицы «bid» и «offer» имеют следующую структуру:
Параметр Тип Описание
price STRING Цена покупки / продажи
quantity STRING Количество в лотах

Ниже фрагмент скрипта Lua с функцией getQuoteLevel2:

Код
ql2 = getQuoteLevel2(class, sec);

BidStr = "";
for i = tonumber(ql2.bid_count), 1, -1 do
BidStr = BidStr..tostring(tonumber(ql2.bid[i].quantity))..";"..tostring(tonumber(ql2.bid[i].price))..";";
end;

OfferStr = "";
for i = tonumber(ql2.offer_count), 1, -1 do
OfferStr = offerStr..tostring(tonumber(ql2.offer[i].quantity))..";"..tostring(tonumber(ql2.offer[i].price))..";";
end;
А теперь о проблеме: - нужно воспроизвести этот скрипт в С++. Никак не получается прочитать из Lua стека таблицу которую возвращает функция getQuoteLevel2.

В С++ делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
std::string class_code=”aaa”;
std::string sec_code=”bbb”;
 
//вызываю функцию getQuoteLevel2
lua_settop(L, 0); // Очищаем стек Lua
lua_getglobal(L, "getQuoteLevel2");
lua_pushstring(L, class_code.c_str());
lua_pushstring(L, sec_code.c_str());
lua_pcall(L, 2, 1, 0);
 
if (!lua_istable(L, 1)) {goto Finish} // Если ошибка, выходим 
 
// Получаю bid_count и offer_count - количество записей (строк ) в таблицах bid и
// offer. 
 
int bid_count;
lua_pushstring(L, "bid_count");
lua_gettable(L, -2);
bid_count = lua_tointeger(L, -1);
lua_pop(L, 1);
 
int offer_count;
lua_pushstring(L, "offer_count");
lua_gettable(L, -2);
offer_count = lua_tointeger(L, -1);
lua_pop(L, 1);
//До этого места вроде работает. Удается получить bid_count и offer_count
//А вот дальше “засада”, не знаю как получить из стека строки самих таблиц bid и offer. Т.е. по аналогии с тем как в скрипте, хочется сделать:

C++
1
2
3
4
5
6
7
for (int i = 0; i < bid_count; i++)
{
//здесь надо как то вытащить из стека i-ю строку таблицы bid и получить из нее
значения price и quantity
}
// и аналогично для таблицы offer.
}
Может кто нибудь что то подскажет. Google не помог. Глубоко копать и изучать Lua не очень хочется, - задача разовая.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2017, 15:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить таблицу Lua С++ (Lua):

Как получить значения переменных Lua Script в коде программы? - Lua
Здравствуйте, мне необходимо изучить и написать небольшую программу с использованием Lua. Пишу я на free pascal. Подключаю библиотеки и...

LUA + C++ - Lua
Привет всем :) я чото не понимаю чо у меня выевляется ошибки luaavg.obj : error LNK2001: неразрешенный внешний символ...

Парсинг lua - Lua
Здравствуйте форумчане,меня озадачило такой задачей,нужно из текста Client ping times: 62 ms : Чпоньк 77 ms : Aнимешник+))) ...

Lua 5.3 и LuaJit - Lua
Возможно ли совместить subj в проекте одновременно? Требуется часть скриптов выполнять в среде Lua, а часть - в среде LuaJit. Динамическая...

Кириллица из Lua в C# - Lua
Добрый день, друзья! Начинаю знакомство с Lua. Столкнулся с проблемой некорректного чтения кириллицы в скриптах. Сам скрипт...

Lua шифрование - Lua
Здравствуйте, есть такая задачка, кто-то сможет помочь? В файле содержатся целые числа в десятичном виде. Преобразовать каждое число в...

7
vantfiles
24 / 24 / 11
Регистрация: 07.05.2013
Сообщений: 91
29.07.2017, 14:27 #2
Чисто из любопытства - терминал поставляется в исходниках?
ps: если в эти выходные будет свободное время, я попробую это дело опробовать, вроде бы задача не кажется сложной...
0
VY
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 5
31.07.2017, 09:35  [ТС] #3
Нет. Терминал поставляется без исходников. Но он поддерживает Lua 5.1, позволяет запускать скрипт, и поддерживает в скрипах некоторые свои функции. Одна из которых getQuoteLevel2(class, sec). Все отлично работает на уровне скрипов в терминале. Но я хочу написать dll на С++, подцепить ее к скрипту, получать в dll торговые данные из терминала, передавать их в свою программу, там обрабатывать, ... и назад в терминал с командой на покупку или продажу.
Все пока получается, вот только "споткнулся на ровном месте" со стеком. Задача действительно кажется не очень сложной, надо только разобраться, что и где храниться в стеке Lua после вызова функции. А я похоже, настолько запутался что вообще перестал уже что либо понимать, - где эти данные и как их получить.
0
vantfiles
24 / 24 / 11
Регистрация: 07.05.2013
Сообщений: 91
31.07.2017, 14:00 #4
Вот это корректный пример такой таблицы?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
t = {
    bid_count   = "4",
    offer_count = "5",
    bid = {
        [1] = { quantity = "1", price = "10" },
        [2] = { quantity = "2", price = "20" },
        [3] = { quantity = "3", price = "30" },
        [4] = { quantity = "4", price = "40" }
    },
    offer = {
        [1] = { quantity = "5", price = "100" },
        [2] = { quantity = "6", price = "200" },
        [3] = { quantity = "7", price = "300" },
        [4] = { quantity = "8", price = "400" },
        [5] = { quantity = "9", price = "400" }
    }
}
0
VY
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 5
31.07.2017, 15:49  [ТС] #5
Да, именно такая таблица и возвращается. Первые два поля удается получить.
0
vantfiles
24 / 24 / 11
Регистрация: 07.05.2013
Сообщений: 91
31.07.2017, 16:25 #6
Для простой таблицы вида ключ(number)-значение(number) код будет выглядеть примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    lua_getglobal( L, "t2" );
    if( !lua_istable( L, -1 ) ){
        lua_pushstring( L, "Conversion error" );
        return lua_error( L );
    }
 
    int t = lua_gettop( L );
    lua_pushnil( L );
 
    size_t cnt = 0;
    while( lua_next( L, t ) ){
        cnt++;
        if( !lua_isnumber( L, -2 ) || !lua_isnumber( L, -1 ) ){
            lua_pushstring( L, "Conversion error" );
            return lua_error( L );
        }
        std::cout << lua_tointeger( L, -2 ) << " - " << lua_tointeger( L, -1 ) << std::endl;
        lua_pop( L, 1 );
    }
Вот такого примера будет достаточно?
0
VY
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 5
01.08.2017, 09:58  [ТС] #7
Спасибо. Сегодня вечером попробую.

Добавлено через 17 часов 7 минут
Не работает. Не очень понятно назначение size_t cnt = 0, - cnt дальше нигде не используется.

Предполагаю, что должно быть как то так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   int t= lua_gettop(L);
   lua_getfield(L, QT, "bid");
   
   //Дальше пройти по строкам таблицы "bid" получая price и quantity
 
 //  while (lua_next(L, ????)
{
// ????????
// price=lua_tostring(L,?????)
// quantity=lua_tostring(L,????)
 
}
 
//и аналогично для таблицы offer
Добавлено через 10 минут
Опечатка, вместо
Цитата Сообщение от VY Посмотреть сообщение
lua_getfield(L, QT, "bid");
конечно же, lua_getfield(L, t, "bid");
0
VY
0 / 0 / 0
Регистрация: 27.07.2017
Сообщений: 5
05.08.2017, 08:29  [ТС] #8
Задача решена. Ответ, как всегда, был рядом - на следующей странице - Lua передача таблицы в программу на C++

Рабочий код:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
lua_getglobal(L, "getQuoteLevel2");
    lua_pushstring(L, class_code.c_str());
    lua_pushstring(L, sec_code.c_str());
    lua_pcall(L, 2, 1, 0);
    
    if (!lua_istable(L, 1)) // Проверяет, является-ли первый элемент стека таблицей Lua
    {
        lua_pushstring(L, "Ошибка передачи котировок в C++ dll");
        return lua_error(L); ; 
    } 
                                       
    //******получаем количество строк в таблицах bid и offer **************************************
 
    lua_pushstring(L, "bid_count"); /* поместить ключ на стек */
    lua_gettable(L, -2); //получить значение 
    bid_count = lua_tointeger(L, -1);
    lua_pop(L, 1);
    
    lua_pushstring(L, "offer_count"); /* поместить ключ на стек */
    lua_gettable(L, -2); //получить значение 
    offer_count = lua_tointeger(L, -1);
    lua_pop(L, 1);
    
    //**Получаем таблицы bid и offer    
    
    lua_getfield(L, -1, "bid");
    
    lua_pushnil(L);                 //стек: -1=ключ равный нулю, -2=ссылка на таблицу 'bid' 
    while (lua_next(L, -2) != 0)   // идем по строкам таблицы bid
    {
        lua_pushnil(L);             //стек: -1=ключ равный нулю, -2 ссылка на таблицу bid[i] (i-ю строку таблицы bid)           
        while (lua_next(L, -2) != 0) //идем по колонкам i-ой строки таблицы bid
        {                        
            if (lua_tostring(L, -2) == "price")
            {
                // что то делаем со значение price, которое лежит в lua_tostring(L, -1)
            }
            if (lua_tostring(L, -2) == "quantity")
            {
                // что то делаем со значение quantity, которое лежит в lua_tostring(L, -1)
            }
 
            lua_pop(L, 1);      // освобождает стек для следующей итерации
        }
        lua_pop(L, 1);        // освобождает стек для следующей итерации
    }
 
// аналогично для таблицы offer
0
05.08.2017, 08:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2017, 08:29
Привет! Вот еще темы с ответами:

Парсер на lua - Lua
Тут описано как подключить и использовать и библиотеку для языка lua http://www.cyberforum.ru/cpp-builder/thread68085.html Возможно ...

*.lua in *.exe - Lua
Кто знает как скрипт на луа компилить в исполняемый файл, подскажите, хочу протестить несколько набросок на компах друзей, а установливать...

Ошибка lua - Lua
Всем привет Попался мне один файлик resource.car после его распаковки появилось 40 файлов с расширением lu Скрин...

Изучение Lua - Lua
Добрый день. Хочу начать изучать язык Lua но не знаю с чего начать. Может кто нибудь подскажет с чего начать. Ссылку полезную даст. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru