Сергей Гаврилов
Сергей Гаврилов личный блог
02 января 2017, 22:52

Он сказал, 'си', она пискнула, "луа, луа", он прошипел, 'шарп'

Луакнутые и сишарпнутые братья объясните убогому можно ли скрестить бульдога с носорогом при помощи LuaInterface или NLua, чисто теоретически я никаких проблем не вижу, но может уже кто уже наткнутся на «подводные камни»
Нашел тут хороший сайт quikluacsharp.ru/... Там меня напугали с аж с двумя плюсами…
36 Комментариев
  • Дмитрий Ш
    02 января 2017, 22:57
    SiLuaNov
  • Евгений Гуревич
    02 января 2017, 23:10
    Зачем вам нужен шарп? Какой-то непонятный язык...

    QLUA тем и хорош, что позволяет в LUA реализовать интерфейс взаимодействия с биржей (выставление, снятие заявок, получение истории из примерно 3000 свечей, и т.д.), а «движок» стратегии упаковать в C++ и приаттачить dll
    • Scorpio
      02 января 2017, 23:14
      Евгений Гуревич, Вы правы, не стоит городить огород. В крайнем случае лучше обойтись C++.
      • Евгений Гуревич
        02 января 2017, 23:24
        Scorpio, верно, можно и целиком на LUA, но я суеверно придерживаюсь убеждения, что машинный код работает быстрее, чем транслятор LUA. В домашних условиях это не даёт преимущества, но всё же…
        • Scorpio
          02 января 2017, 23:29
          Евгений Гуревич, нашёл автору решение. Но стоит так заморачиваться при условии, что на C#, реально что-то сильное реализовано.
      • dagh
        03 января 2017, 06:47
        Scorpio, «В крайнем случае лучше обойтись C++.»

        это все равно что сказать, что «бегемот больше гиппопотама.»


        Это два практически идентичных по синтаксису языка С++ и С#.


        С# в алго применяется чаще, к нему больше библиотек прилагается чем к С++.
        Это не в укор LUA. LUA это более высокоуровневый язык, ближе к скриптам…
  • Scorpio
    02 января 2017, 23:12
    Если я правильно понял, то Вам нужна библиотека на C++, которую вы импортируете из Lua, а потом через именованную память ваша библиотека будет обмениваться данными с C# приложением.
    Взял от сюда
    quikluacsharp.ru/qlua-c-cpp-csharp/konnektor-dll-quik-qlua-lua-c/
    и от сюда
    quikluacsharp.ru/qlua-c-cpp-csharp/obmen-dannymi-mezhdu-dll-c-c-i-prilozheniem-c/
      • Scorpio
        03 января 2017, 00:02
        Сергей Гаврилов, Вы сами сказали у Вас богатый опыт в C#, пользуйтесь им.
  • Scorpio
    02 января 2017, 23:15
     Автор, на C# что за код у Вас?
  • Scorpio
    02 января 2017, 23:23
    Ещё как вариант сразу писать библиотеку на C# с экспортом функции.
    jonxxx.me/13-metatrader/15-eksport-funktsij-iz-net-dll-c-dllexport-net-framework-v-metatrader
      • Scorpio
        03 января 2017, 00:08
        Сергей Гаврилов, Покажите лог.
          • Scorpio
            03 января 2017, 00:10
            Сергей Гаврилов, Компиляции в русскоязычной студии.
          • Scorpio
            03 января 2017, 00:19
            Сергей Гаврилов, Нашёл решение проблемы. Вам нужно изменить язык для приложений которые не поддерживают юникод на английский и перезапустить систему.

            oxozle.com/2014/07/02/kak-izmenit-yazyk-dlya-ne-unicode-programm-v-windows-8
  • Scorpio
    02 января 2017, 23:27

    //=== Реализация функций, вызываемых из 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 }, // из скрипта Lua эту функцию можно будет вызывать так: QluaCSharpConnector.TestFunc(); здесь можно указать любое другое название
    { NULL, NULL }
    };

    //=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
    extern «C» LUALIB_API int luaopen_QluaCSharpConnector(lua_State *L) {
    luaL_openlib(L, «QluaCSharpConnector», ls_lib, 0);
    return 0;
    }


    Тут ещё инициализация. Если не разбираться в интерфейсе, то лучше импортировать С++ DLL из примера, далее в этой же DLL импортировать свои функции из C# библиотеки.
  • zica
    02 января 2017, 23:40
    "Он сказал - поехали, он взмахнул рукой,
    Словно вдоль по Питерской, Питерской
    Пронёсся над Землёй.
    Словно вдоль по Питерской, Питерской
    Пронёсся над Землёй.
    
    Знаете, каким он парнем был,
    Как поля родные он любил.
    В той степной дали первый старт с Земли,
    Был признаньем ей в любви.
    
    Он сказал - поехали, он взмахнул рукой,
    Словно вдоль по Питерской, Питерской
    Пронёсся над Землёй.
    Словно вдоль по Питерской, Питерской
    Пронёсся над Землёй."<br><br>https://www.youtube.com/watch?v=sMeOrfu6f8U
    
    • Scorpio
      03 января 2017, 00:01
      Сергей Гаврилов, Пожалуйста, делайте, на C++ есть пример.
      Большой опыт — существенная причина. Вперёд!
    • Prophetic
      03 января 2017, 09:45
      Сергей Гаврилов, думаю, Вам сюда: https://github.com/finsight/QuikSharp

    • Александр
      03 января 2017, 10:28
      Сергей Гаврилов, А вы знаете, что скрипт работает в разных потоках и эти потоки не основные. Поэтому прикручивая UI на с# к lua скрипту вы можете получить массу глюков. Форма то будет крутиться не в основном потоке квика.
      Так что лучше передавать данные из квика в свое собственное приложение.
      Можно писать приложения на с#, для этого есть несколько вариантов:
      1. Создать таблицу экспортов в dll на c#. Но есть одно, но — передача параметров в lua api происходит по типу с. Это надо учесть. Утилиту github.com/Jonxxx/ExportDll можно переделать тут.
      а так почитать эту тему jonxxx.me/13-metatrader/15-eksport-funktsij-iz-net-dll-c-dllexport-net-framework-v-metatrader
      Там есть моя утилита, но она конвертацию параметров делает по умолчанию stdcall (https://yadi.sk/d/E1x2KDeLjniVB)
      2. Написать переходник на с++, как собственно делается в разного рода LuaInterface. В этом переходнике создавать классы на с# и вызывать нужные функции.
        • Александр
          03 января 2017, 13:41
          Сергей Гаврилов, Я бы на вашем месте реализовал бы по другому. Написал бы на си++ передачу данных в приложение с# через файловый меппинг или пайпы. Так сделано quikluacsharp.ru/qlua-c-cpp-csharp/obmen-dannymi-mezhdu-dll-c-c-i-prilozheniem-c/
          Это сделать легче всего и меньше будет проблем.
          Да поможет мне dispatcher…
          Может и не помочь. Тут куча ведь неизвестных. Квик написан на си++ и полностью нативное приложение. GUI вы собираетесь писать на c# и wpf да еще не в контексте основного потока. Lua Api приспособлен больше для нативных языков. Если вы не знакомы с Lua Api, разберитесь как с ним взаимодействовать на си++. А потом на си++ вызывайте классы из си# с вашими формами на wpf напрямую.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн