Спасибо этому форуму за советы и подсказки. Как принять в dll таблицу с целочисленными ключами, разобрался. Прошу подсказать как внутри dll разобрать по полям более сложную таблицу.
Код
qt=getQuoteLevel2(class, sec)
Согласно документации она возвращает таблицу, в которой два стринга и две вложенных таблицы.
Мне нужны для работы все четыре. Как мне, к примеру, получить объём из 3-й котировки на покупку?
Для разбора таблицы с целочисленными индексами мой код внутри dll выглядит так:
Код
static int forLua_SumArray(lua_State* L) {
// Get the length of the table (same as # operator in Lua)
int n = lua_objlen(L, 1);
double sum = 0.0;
// For each index from 1 to n, get the table value as a number and add to sum
for (int i = 1; i <= n; ++i) {
lua_rawgeti(L, 1, i);
sum += lua_tonumber(L, -1);
lua_pop(L, 1);
}
lua_pushnumber(L, sum);
return 1;
}
Let_it_go написал: Может быть и проще, но я ничего про это не знаю. Расскажите пожалуйста общий смысл.
Пишется класс в который оборачивается указатель на стейт. Пишутся сервиные функции по типу чтения/записи с/на стек разного типа переменных. использование регистра. вызова функции. создания таблиц и т.д. вобщем обертка над lua c api. Дальше шаблонные функции исходя из того что им передают вызывают lua c api. для каждого параметра. В итоге код досточно простой получается.
Код
void OnMain(lua::qlua q)
{
lua::table t = q.getQuoteLevel2("SPBFUT", "RIM8");
int bid_count = t["bid_count"];
if (bid_count < 3) return;
lua::table bid = t["bid"];
if (bid == nil) return;
lua::table bid3 = bid[3];
const char* price = bid3["price"];
const char* quantity = bid3["quantity"];
}
extern "C" __declspec(dllexport) int luaopen_testlib(lua_State *L)
{
lua::qlua q(L);
q["main"] = OnMain; //все что нужно для регистрации колбека (шаблон сам раскрывает параметры со стека исходя из сигнатуры функции и передает их в функцию выше.
}
Готовые такие врапперы например 1) https://github.com/SteveKChiu/lua-intf 2) https://github.com/jeremyong/Selene Как их подключать и использовать описано в каждом из проектов. В основном это просто заголовочные файлы. все достаточно просто, скачиваете, делаете include и готово)Мне вот например синтаксис использования этих врапперов не зашел. Пришлось изучить их вдоль и поперек и сам апи луа, в итоге свой враппер реализовал) но это долгий путь. лучше готовое взять. selene вполне неплох. ps. еще на форум выкладывали враппер на макросах. где и функции+таблицы из qlua уже описаны были. тоже можно попробывать, как вариант.
и ещё вопрос. Я понял суть врапперов, естественно с ними проще. но всё же, как решить мою задачу без них? принять таблицу-стакан из OnQuote внутри dll? я сейчас читаю книгу по Луа, написанную её разработчиком. Иду шаг за шагом по главе "C API". В голове каша, но первые проблески уже есть. Строки и числа я уже спокойно обрабатываю в dll.
Антон, спасибо!!! К тому моменту как увидел ваш ответ, уже накорябал свой вариант, но по прежнему не знал как читать вложенные таблицы (стакан и его поля).
Код
static int forLua_OnQuoteC(lua_State* L) {
lua_pushnil(L);
int s = 0;
while (lua_next(L, -2))
{
s = s + 1;
const char* key = lua_tostring(L, -2);
double val = lua_tonumber(L, -1);
lua_pop(L, 1);
}
return 1;
}
Просто думал вызов будет каким-то таким, не ошибка)
Код
static int forLua_SumArray(lua_State* L) {
getQuote3(L);
/* остальное */
}
Но вообще да. я код не компилил и не проверял на 100% правильность так что возможно гдето еще недочеты. Если нужно этот код из lua вызывать то да, все функции которые пробрасываем в луа
Код
lua_CFunction=int(lua_State*)
что компилятор вам и указал во 2й строке скриншота
Павел Валин, да там все верно. ошибки такие с которыми dll точно бы не сбилдилась. старые мб остались. не видит функции с которыми длл билдится. ерунда вобщем
Антон, угу. я даж с поддеркой CLR это запустить смог. короч странно да. Пару раз мне такую же шляпу написало. но слинковал и всё запустилось. кэш зло )