Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
96 / 1 / 0
Регистрация: 04.10.2022
Сообщений: 41

Как получить доступ к таблице переделанной из Lua в С++ ?

04.10.2022, 14:09. Показов 1213. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи, мучаюсь уже третий день, перепробовал и перечитал все что можно.

В приложении, где исполняется код Lua есть встроенная функция, которая возвращает таблицу в таком формате:

C
1
2
3
4
Тип         параметры               Описание
 
Size          function          Returns the current size
Close        function          Removes a data source


В Lua я получаю таблицу и отправляю ее в C++:

C
1
2
3
4
5
local my_table = some_func_in_Lua (code_class_, code_paper_, interval)
 
local size_table = my_table:Size()
 
message(tostring(size_table)) // не равно нулю
Отправляю в dll в C++:

C
1
Quik_Lua_connector.get_data_from_Lua(size_table)

В dll я принимаю:

C++
1
2
3
4
static int forLua_get_data_from_Lua (lua_State * L)
{
        std::cout << "Size:" << lua_tonumber(L, -1) << std::endl; //Получаю данные с вершины стека. На консоли все отображается нормально.
}

Теперь я хочу передать не отдельный параметр полученной таблицы my_table, а сразу весь объект таблицы

Отправляю в dll в C++:

C
1
Quik_Lua_connector.get_data_from_Lua(my_table)

Принимаю в dll и например хочу получить размер этой таблицы и тут начинаются ПРОБЛЕМЫ:

Пример №1:

C++
1
2
3
4
5
lua_pushstring(L, "Size"); // Помещаем ключ на вершину стека.
 
lua_gettable(L, -2); //lua_gettable - кладет на вершину стека значение Таблицы, которая находится первым элементом в стеке по ключу, находящемуся на вершине стека, то есть по клавише "Размер"
 
std::cout << "Size:" << lua_tonumber(L, -1) << std::endl; // Я выталкиваю значение из вершины стека, НО оно равно НУЛЮ!!! ХОТЯ таблица, переданная из Lua в C++, гарантированно будет иметь размер

Хорошо, я попробую другой пример:

Пример №2:

C++
1
2
3
4
5
6
7
8
9
10
11
12
lua_pushstring(L, "Size"); // Помещаем имя функции "Размер" на вершину стека
 
int status_lua_pcall = lua_pcall (L, 1, 1, 0); //вызываю lua_pcall, которая принимает количество переданных аргументов - в моем случае это аргумент Size() - то есть 1, и количество результатов, которые должна вернуть функция - то есть размер таблицы - то же 1.
 
     if(status_lua_pcall != 0)
     {
         std::cout << "Error_lua_pcall:" << lua_tostring(L, -1) << std::endl;
     }
     else
     {
         std::cout << "lua_pcall_result:" << lua_tonumber(L, -1) << std::endl;
     }
lua_pcal терпит неудачу с ошибкой "error in error handling".

Пример №3:

lua_gettable(L, -1);

lua_getglobal(L, "Size");

lua_pushvalue (L, -2);

int status_lua_pcall = lua_pcall (L, 1, 1, 0);

C++
1
2
3
4
5
6
7
8
9
if (status_lua_pcall != 0)
{
    std::cout << "Error_lua_pcall:" << lua_tostring(L, -1) << std::endl;
 
}
else
{
    std::cout << "lua_pcall_result:" << lua_tonumber(L, -1) << std::endl;
}

lua_pcal терпит неудачу с "error in error handling".

Я уже не просто не знаю, ну что не так ???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2022, 14:09
Ответы с готовыми решениями:

Как получить доступ к таблице в .mdb-файле
Не получается изменить данные в таблице Access, получается только извлечение данных. Подскажите, что не так?

Как можно получить доступ к отдельной таблице на страничке сайта
Есть страничка сайта http://abri.une.edu.au/online/cgi-bin/i4.dll?1=223D2B2A&amp;2=2420&amp;3=56&amp;5=2B3C2B3C3A&amp;6=5D5E5D235B272221&amp;9=5A5D5A5D ...

Как получить доступ к содержимому ячеек в таблице на стороне сервера?
Таблица (HTML) построена так: &lt;% For i = 0 to N %&gt; &lt;TR&gt; &lt;TD&gt;&lt;asp:TextBox id='txtMeavteah' runat='server'...

12
Модератор
 Аватар для Curry
5158 / 3479 / 536
Регистрация: 01.06.2013
Сообщений: 7,540
Записей в блоге: 9
04.10.2022, 14:51
Цитата Сообщение от Lunar_ Посмотреть сообщение
Принимаю в dll и например хочу получить размер этой таблицы и тут начинаются ПРОБЛЕМЫ:
На вершине стека после вызова lua_gettable сама функция а не её значение. Функцию ещё и вызывать надо.
Проверьте тип данных на вершине стека. Что возвращают функции lua_iscfunction, lua_isfunction ?

Добавлено через 14 минут
Сейчас не могу проверить. Предполагаю что после получения функции на вершину стека нужно вызывать
C++
1
lua_call(L,0,1);
Добавлено через 47 секунд
и получить значение через lua_tonumber(L, -1)
0
96 / 1 / 0
Регистрация: 04.10.2022
Сообщений: 41
04.10.2022, 15:58  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
На вершине стека после вызова lua_gettable сама функция а не её значение. Функцию ещё и вызывать надо.
Проверьте тип данных на вершине стека. Что возвращают функции lua_iscfunction, lua_isfunction ?

C++
1
2
3
4
5
6
7
8
    lua_pushstring(L, "Size");
    lua_gettable(L, -2);
 
    int status_lua_isC_function = lua_iscfunction(L, -1);
    std::cout << "status_lua_isC_function:" << status_lua_isC_function << std::endl;
 
    int status_lua_is_function = lua_isfunction(L, -1);
    std::cout << "status_lua_is_function:" << status_lua_is_function << std::endl;

status_lua_isC_function: 1
status_lua_is_function: 1
0
Модератор
 Аватар для Curry
5158 / 3479 / 536
Регистрация: 01.06.2013
Сообщений: 7,540
Записей в блоге: 9
04.10.2022, 16:05
Lunar_, попробуйте
C++
1
2
3
4
    lua_pushstring(L, "Size");
    lua_gettable(L, -2);
    lua_call(L,0,1);
    std::cout << "Size:" << lua_tonumber(L, -1) << std::endl;
0
96 / 1 / 0
Регистрация: 04.10.2022
Сообщений: 41
04.10.2022, 16:10  [ТС]
Пробjвал так:

Вариант_1:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 lua_pushstring(L, "Size");
    lua_gettable(L, -2);
 
 
    int status_lua_isC_function = lua_iscfunction(L, -1);
    std::cout << "status_lua_isC_function:" << status_lua_isC_function << std::endl;   //return 1
 
 
    int status_lua_is_function = lua_isfunction(L, -1);
    std::cout << "status_lua_is_function:" << status_lua_is_function << std::endl;      //return 1
 
       //То есть на вершине стека сейчас находится функция...
 
    lua_call(L, 0, 1);    //Вызываю lua_call - без указания передаваемого аргумента и с возвращаемым результатом в виде одной переменной
 
    std::cout << "lua_pcall_result:" << lua_tonumber(L, -1) << std::endl;
Не работает, после lua_call - код не выполняется.


Вариант_2:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 lua_pushstring(L, "Size");
    lua_gettable(L, -2);
 
 
    int status_lua_isC_function = lua_iscfunction(L, -1);
    std::cout << "status_lua_isC_function:" << status_lua_isC_function << std::endl;   //return 1
 
 
    int status_lua_is_function = lua_isfunction(L, -1);
    std::cout << "status_lua_is_function:" << status_lua_is_function << std::endl;      //return 1
 
       //То есть на вершине стека сейчас находится функция...
 
    lua_pushvalue(L, -2); // помещаю копию первого элемента стеке, то есть самого переданного объекта таблицы на вершину стека, то есть после функции, как аргумент функции
 
    lua_call(L, 1, 1);    //Вызываю lua_call - с указанием передаваемого аргумента в виде самого объекта таблицы и с возвращаемым результатом в виде одной переменной
 
    std::cout << "lua_pcall_result:" << lua_tonumber(L, -1) << std::endl;
Не работает - то же самое после lua_call - код не выполняется.


Это какой пп,,.ц, я скоро сумасойду...
0
Модератор
 Аватар для Curry
5158 / 3479 / 536
Регистрация: 01.06.2013
Сообщений: 7,540
Записей в блоге: 9
04.10.2022, 16:40
Попробуйте lua_pcall .

Добавлено через 1 минуту
... и посмотреть что она возвращает. ЕСли вообще возвращается.
1
96 / 1 / 0
Регистрация: 04.10.2022
Сообщений: 41
04.10.2022, 16:58  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
Попробуйте lua_pcall .

Добавлено через 1 минуту
... и посмотреть что она возвращает. ЕСли вообще возвращается.
В обоих случаях lua_pcall(L, 0, 1, 0) или lua_pcall(L, 1, 1, 0);

Возвращает значение 5, а не вершину стека помешается: "error in error handling"

Значение 5 - значит LUA_ERRERR: ошибка во время выполнения обработчика ошибок
0
Модератор
 Аватар для Curry
5158 / 3479 / 536
Регистрация: 01.06.2013
Сообщений: 7,540
Записей в блоге: 9
04.10.2022, 17:35
Давно не имел дело с quik-ом.
Вы загружаете вашу dll через require ?
Где то в этом дело, в правильности вызова dll.
Есть специальные пакеты Luabind, LuaBridge для этого, хотя я с ними дело не имел. Я только вызывал интерпретатор lua из своих программ (не quik) и предоставлял им свои функции.

Позовём эксперта vantfiles.
Сообщите версию lua.
Ещё можно бы спросить на форуме quik-а, вдруг у него свои требования к вызовам. Ссылки на другие форумы здесь запрещены, если что. Так что не ссылаюсь.
2
96 / 1 / 0
Регистрация: 04.10.2022
Сообщений: 41
04.10.2022, 19:35  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
Давно не имел дело с quik-ом.
Вы загружаете вашу dll через require ?
Где то в этом дело, в правильности вызова dll.
Есть специальные пакеты Luabind, LuaBridge для этого, хотя я с ними дело не имел. Я только вызывал интерпретатор lua из своих программ (не quik) и предоставлял им свои функции.

Позовём эксперта vantfiles.
Сообщите версию lua.
Ещё можно бы спросить на форуме quik-а, вдруг у него свои требования к вызовам. Ссылки на другие форумы здесь запрещены, если что. Так что не ссылаюсь.
Да, через require.
Сама dll - подключается нормально, я передаю числовые значения, строки и даже обычную таблицу в виде одномерного массива из Quik`а в dll - и без проблем извлекаю значения.

Но вот именно с этой таблицей - какая то адовая фигня творится.

Версия Lua - 5.4

Добавлено через 1 час 45 минут
Причем не работает даже простой вызов функции Lua из C++:

Lua код:
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
Lua_code:
function my_func_Lua()
 
message("my_func_Lua")
 
end
 
 
 
function main()
 
Quik_Lua_connector = require("Quik_Lua_connector_TEST")  
 
Quik_Lua_connector_TEST() 
 
 
 
-------------------------
while not stopped do 
sleep(1)
end 
-------------------------
 
end


C++ код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static int Quik_Lua_connector_TEST(lua_State* L)
{
 
    std::cout << "Start" << std::endl;
 
    lua_getglobal(L, "my_func_Lua");  // получаю функцию
 
 
    //Проверяю, что на вершине стека находится теперь именно функция:    int status_lua_is_function = lua_isfunction(L, -1); 
    std::cout << "status_lua_is_function:" << status_lua_is_function << std::endl;        //return 1  - значит Lua функция.
 
 
 
 
     int status = lua_pcall(L, 0, 0, 0);    //Вызываю функцию без аргументов и бещ возвратного значения.
 
    if (status != 0)
    {
        std::cout << "error:" << lua_tostring(L, -1) << std::endl; //ОШИБКА: error in error handling
    }
 
}

lua_pcall ВСЕГДА завершается ошибкой "error in error handling"
0
Модератор
 Аватар для Curry
5158 / 3479 / 536
Регистрация: 01.06.2013
Сообщений: 7,540
Записей в блоге: 9
04.10.2022, 19:54
Вы dll создавали как тут?
Если иначе никак то я бы попробовал сделать глобальную lua функцию вызывающую Size
Lua
1
2
3
SizeWrapper = function()
   return my_table:Size() -- my_table должна уже быть в области видимости 
end
А уже её вызывать из C++.
C++
1
2
3
4
   lua_getglobal(L, "SizeWrapper");
   int status = lua_pcall(L, 0, 1, 0);
   auto result = lua_tonumber(L, -1);
   lua_pop(L, 1);
Цитата Сообщение от Lunar_ Посмотреть сообщение
function my_func_Lua()
message("my_func_Lua")
end
Попробуйте
Lua
1
2
3
my_func_Lua = function()
    message("my_func_Lua")
end
1
96 / 1 / 0
Регистрация: 04.10.2022
Сообщений: 41
04.10.2022, 22:23  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
Попробуйте
Lua
1
2
3
my_func_Lua = function()
    message("my_func_Lua")
end
Все одно и тоже Lua_pcall - завершается с ошибкой: "error in error handling"

Добавлено через 2 часа 2 минуты
Да проблема было в сборке.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
05.10.2022, 20:52
Lunar_, предлагаю воспользоваться библиотекой Sol2 и не мучаться с низкоуровневым стековым API Lua.
2
 Аватар для swerg2
5 / 3 / 1
Регистрация: 07.09.2021
Сообщений: 17
08.10.2022, 09:12
Разобрались
[Удалена ссылка на форум]

Проблема были в неудачных сборках lib-библиотек Lua
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2022, 09:12
Помогаю со студенческими работами здесь

HtmlAgilityPack.dll, не получается получить доступ к таблице
/// &lt;summary&gt;Получить информацию о документе включающую его тип&lt;/summary&gt; public DocumentInfo SearchSign(string fileName) ...

Получить доступ к таблице GDT хотя бы для чтения
%include &quot;io64.inc&quot; ; синтаксис NASM section .data .gdtr: times 10 db 0x00 ; Первые два - размер GDT, следующие 4 - адрес начала...

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

Lua и С++. Обращение к таблице, вложенной в др. таблицу
Пример, есть глобальная таблица player player = { position = { x = 30.0, y = 20.0, z = 0.0 }, name =...

Как получить доступ к ftp, http и ssh по VPN через роутер, если есть доступ к samba?
Есть системник с Ubuntu Server 12.04. Он находится за роутером. На системнике стоит PPTP VPN. На роутере проброшены vpn порты на системник,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru