Lua - C++ - примеры

Страницы: 1
RSS
Lua - C++ - примеры
 
Подскажите, есть ли какие ни будь условно официальные примеры, как связать С++ с Quik ?
Как сделать dll ?
 
https://quik2dde.ru/viewforum.php?id=14
 
Цитата
Serg_ написал:
Подскажите, есть ли какие ни будь условно официальные примеры, как связать С++ с Quik ?
Как сделать dll ?
Все есть безусловно официально.
В КВИК встроена виртуальная машина луа без каких либо изменений исходников
поэтому читайте API C для  lua.
-------------------------
Я так пишу функции для QUIK  на СИ от  колбек
до многопоточной обработки данных в LUA.
----------------------
QLUA - это библиотека написанная на API C.
--------------------
Или в чем то другом проблема?
 
Цитата
nikolz написал:
Цитата
Serg_ написал:
Подскажите, есть ли какие ни будь условно официальные примеры, как связать С++ с Quik ?
Как сделать dll ?
Все есть безусловно официально.
В КВИК встроена виртуальная машина луа без каких либо изменений исходников
поэтому читайте API C для  lua.
-------------------------
Я так пишу функции для QUIK  на СИ от  колбек
до многопоточной обработки данных в LUA.
----------------------
QLUA - это библиотека написанная на API C.
--------------------
Или в чем то другом проблема?
Не могу понять, как через dll - все это делать. Откроено говоря - это неМного геморрой. Продукту 20 лет, а нормального API почему то нет.
 
Цитата
swerg написал:
https://quik2dde.ru/viewforum.php?id=14
Извините, не могу зарегистрироваться на том форуме, не приходит письмо активации.

Если есть возможность, то могли бы Вы подсказать ?
Сделал, как в Вашем примере на 3 стр, Visual Studio создала dll ---> "lua_dll_x64_name.dll" - компилировал, как debug x64.
Скопировал "lua_dll_x64_name.dll" в папку с quik, где находится файл Info.exe и запустил скрипт:
Код
path = getScriptPath() .. "\\lua_dll_x64_name.dll"
package.loadlib(path, "luaopen_lua_dll_x64_name")()

function main()
   message(lua_dll_x64_name.TestFunc())
end
Однако quik выдает ошибку:
Код
Lua_script.lua.txt:3: attempt to index a boolean value (global 'lua_dll_x64_name')
 
Точнее вот эту ошибку:
Код
attempt to call a nil value
 
Не могу понять даже, как дебажить эту ошибку.
 
Цитата
Serg_ написал:
Цитата
nikolz написал:
 
Цитата
Serg_  написал:
Подскажите, есть ли какие ни будь условно официальные примеры, как связать С++ с Quik ?
Как сделать dll ?
 Все есть безусловно официально.
В КВИК встроена виртуальная машина луа без каких либо изменений исходников
поэтому читайте API C для  lua.
-------------------------
Я так пишу функции для QUIK  на СИ от  колбек
до многопоточной обработки данных в LUA.
----------------------
QLUA - это библиотека написанная на API C.
--------------------
Или в чем то другом проблема?
Не могу понять, как через dll - все это делать. Откроено говоря - это неМного геморрой. Продукту 20 лет, а нормального API почему то нет.
Вообще-то есть даже учебники о том как использовать API C
------------
как писать dll
поясняю
-------------------
берете любой компилятор СИ
---------------
Я например последнее время для dll луа использую Pelles C
Очень хороший пакет именно для СИ
--------------
иногда использую MVC.
================
Далее в любимом IDE выбираете создать DLL
и пишите программу на CB
Функции СИ пишите как обычно для СИ
А для вызова их из луа делаете обертку
--------------
типа такой:
--------------------
static int stop(lua_State *L) {  
//здесь вставляете преобразование данных луа в данные СИ
QueryPerformanceCounter(&count1);

lua_pushinteger(L,(count1.QuadPart-count.QuadPart)); //это преобразование целого  в формат луа и запись в стек
return 1;  -- это число возвращаемых параметров
}
Все функции API C
здесь
http://antirek.github.io/luabook/api.htm
если любите C++
то читайте это:
https://habr.com/ru/post/237503/
-------
 
Цитата
nikolz написал:
https://quik2dde.ru/viewforum.php?id=14
Сделал по примеру swerg: https://quik2dde.ru/viewforum.php?id=14

выдает ошибку.
 
Цитата
Serg_ написал:
Цитата
nikolz написал:
https://quik2dde.ru/viewforum.php?id=14
Сделал по примеру swerg:  https://quik2dde.ru/viewforum.php?id=14

выдает ошибку.
какую?
 
изучите исходники w32 sweg
там все понятно
 
Цитата
nikolz написал:
Цитата
Serg_ написал:
 
Цитата
nikolz  написал:
 https://quik2dde.ru/viewforum.php?id=14  
 Сделал по примеру swerg:   https://quik2dde.ru/viewforum.php?id=14  

выдает ошибку.
какую?

Я делаю так:

Код
//=== Необходимые для Lua константы ============================================================================//
#define LUA_LIB
#define LUA_BUILD_AS_DLL

//=== Заголовочные файлы LUA ===================================================================================//
extern "C" {
#include "Lua\lauxlib.h"
#include "Lua\lua.h"
}

//=== Стандартная точка входа для DLL ==========================================================================//
BOOL APIENTRY DllMain(HANDLE hModule, DWORD  fdwReason, LPVOID lpReserved) {
    return TRUE;
}

//=== Реализация функций, вызываемых из LUA ====================================================================//
static int forLua_TestFunc(lua_State* L){
    lua_pushstring(L, "Привет из C/C++");
    return(1);
}


//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
static struct luaL_Reg ls_lib[] = {
    {"TestFunc", forLua_TestFunc},
    {NULL, NULL}
};

//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
    lua_newtable(L);
    luaL_setfuncs(L, ls_lib, 0);
    lua_pushvalue(L, -1);
    lua_setglobal(L, "lua_dll_x64_name");
    return 0;
}

Visual Studio компилирует .dll.

Я помещаю созданный lua_dll_x64_name.dll в папку с quik, где находися файл info.exe. Запускаю в quik скрипт:
Код
lua_dll_x64_name = require("lua_dll_x64_name")

message(lua_dll_x64_name.TestFunc())

Но quik выдает ошибку:
Код
attempt to index a boolean value (global 'lua_dll_x64_name')
 
сделайте так:
---------------------
lua_dll_x64_name = require("lua_dll_x64_name")

message((tostring(lua_dll_x64_name)) -- печатает что это таблица если правильно
message(tostring(lua_dll_x64_name.TestFunc())) -- напечатает результат
 
вообще-то лучше делать все в SciTe
это редактор на луа с отладциком
пока вам квик не нужен
напишите тест для луа
 
в редакторе используйте print
и контрольную печать в СИ
в SCITE будет видно все
 
у вас ошибка в
----------------------
extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
   lua_newtable(L);  
   luaL_setfuncs(L, ls_lib, 0);
   lua_pushvalue(L, -1);
   lua_setglobal(L, "lua_dll_x64_name");
   return 0;
}

-- для LUA5.3 надо так:

//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
luaL_Reg ls_lib[] = {
   {"TestFunc", forLua_TestFunc},
   {NULL, NULL}
};

//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
luaL_newlib(L,ls_lib);
lua_setglobal(L,  "lua_dll_x64_name");
  return 1;
}
 
Цитата
nikolz написал:
у вас ошибка в
Ну так написано у Swerg`а.
 
Цитата
Serg_ написал:
Цитата
nikolz написал:
у вас ошибка в
Ну так написано у Swerg`а.
у него для разных версий есть
посмотрите для какой вы взяли пример
надо брать не ниже 5.3
 
Цитата
nikolz написал:
Цитата
Serg_ написал:
 
Цитата
nikolz  написал:
у вас ошибка в
 Ну так написано у Swerg`а.
у него для разных версий есть
посмотрите для какой вы взяли пример
надо брать не ниже 5.3
Так я для 5.3 и взял.
 
я использую 5.3 так как это работает для всех версий КВИК
а 5.4 лишь начиная с 9.X но пока там много ошибок
и там можно включить 5.3
для 5.4 не помню, возможно и так как у вас.
 
ну как знаете
я Вам пишу со своих работающих исходников
 
Цитата
nikolz написал:
ну как знаете
я Вам пишу со своих работающих исходников
Так  я не понял. А в чем ошибка то в lua_newtable(L);   ?
 
Цитата
Serg_ написал:
Цитата
nikolz написал:
ну как знаете
я Вам пишу со своих работающих исходников
Так  я не понял. А в чем ошибка то в lua_newtable(L);   ?
если непонятно, то смотрим документацию:
https://www.lua.org/manual/5.3/manual.html
согласно документации можно и так и эдак:
luaL_newlib

void luaL_newlib (lua_State *L, const luaL_Reg l[]);

Создает новую таблицу и регистрирует там функции в списке l.

Он реализован в виде следующего макроса:

(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))

Массив lдолжен быть фактическим массивом, а не указателем на него.

luaL_newlibtable

аннулирует luaL_newlibtable (lua_State *L, const luaL_Reg l[]);

Создает новую таблицу с размером, оптимизированным для хранения всех записей в массиве l(но фактически не сохраняет их). Оно предназначено для использования в сочетании с luaL_setfuncs(см. luaL_newlib).

Он реализован в виде макроса. Массив lдолжен быть фактическим массивом, а не указателем на него.

 
используйте SciTe для отладки Вашего теста
 
Цитата
nikolz написал:
sweg
Цитата
nikolz написал:
Цитата
Serg_ написал:
 
Цитата
nikolz  написал:
ну как знаете
я Вам пишу со своих работающих исходников
 Так  я не понял. А в чем ошибка то в lua_newtable(L);   ?

согласно документации можно и так и эдак:
Но если можно и так и эдак, то почему ошибка то возникает.
 
Цитата
Serg_ написал:
Цитата
nikolz написал:
sweg
 
Цитата
nikolz написал:
 
Цитата
Serg_  написал:
 
Цитата
 nikolz   написал:
ну как знаете
я Вам пишу со своих работающих исходников
  Так  я не понял. А в чем ошибка то в lua_newtable(L);   ?

согласно документации можно и так и эдак:
Но если можно и так и эдак, то почему ошибка то возникает.
поставьте контрольную печать, либо выложите свой исходник полностью.
 
возьмите Scite и поставьте контрольную печать и увидите где ошибки
 
Цитата
Serg_ написал:
Цитата
swerg написал:
 https://quik2dde.ru/viewforum.php?id=14  
Извините, не могу зарегистрироваться на том форуме, не приходит письмо активации.
Регистрация удалась, я верно понял?

Цитата
Serg_Если есть возможность, то могли бы Вы подсказать ?
Сделал, как в Вашем примере на 3 стр
Это пример, опубликованный одним из участников форума.
К нему и вопросы почему этот код не работает.
 
Цитата
nikolz написал:
у вас ошибка в
----------------------
extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
    lua_newtable(L);  
   luaL_setfuncs(L, ls_lib, 0);
   lua_pushvalue(L, -1);
   lua_setglobal(L, "lua_dll_x64_name");
   return 0;
}

-- для LUA5.3 надо так:

//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
luaL_Reg ls_lib[] = {
   {"TestFunc", forLua_TestFunc},
   {NULL, NULL}
};

//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
luaL_newlib(L,ls_lib);
lua_setglobal(L,  "lua_dll_x64_name");
  return 1;
}
Вы напишите, как я написал или разбирайтесь как правильно раскрыть макрос
--------------
(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
и нужно ли удалять значение из стека
lua_pushvalue(L, -1);
--------------------
у меня один оператор, а умник наплодил три.
 
Цитата
nikolz написал:
Цитата
Вы напишите, как я написал или разбирайтесь как правильно раскрыть макрос
--------------
(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
и нужно ли удалять значение из стека
lua_pushvalue(L, -1);
--------------------
у меня один оператор, а умник наплодил три.

Код
extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) 
{
    luaL_newlib(L, ls_lib);
    return 1;
}
Однако при запуске скрипта:
Код
path = getScriptPath() .. "\\lua_dll_x64_name.dll"
package.loadlib(path, "luaopen_lua_dll_x64_name")()

function main()
   message(lua_dll_x64_name.TestFunc())
end
Все равно в квике возникает ошибка:
Код
\Quil_Lua_connector\Lua_script.lua.txt:2: attempt to call a nil value
 
Цитата
Цитата
Вы напишите, как я написал или разбирайтесь как правильно раскрыть макрос
Вы уверены ?? Что у Вас это работает ?? У меня НЕ РАБОТАЕТ.
 
Цитата
Serg_ написал:
Цитата
  Вы напишите, как я написал или разбирайтесь как правильно раскрыть макрос
Вы уверены ?? Что у Вас это работает ?? У меня НЕ РАБОТАЕТ.
В соседней теме написал Соберите на 5.3 и либ должна быть lua53.lib
 
У меня проблем нет.
Страницы: 1
Читают тему
Наверх