Ошибки, баги, вопросы - страница 1017

 
A100:

Короче нельзя определить реализацию функции в .mqh и использовать ее без проблем в любом .ex5 

:)

Можно.  Но в случае когда ты из одного .ex5  вызываешь функции другого .ex5, при том, что функция с таким именем существует в обоих, ты должон позаботиться об точном указании прострканства имён. То бишь тот самый ::В() должен по идее проблему решать.  А если он не решает - то это в сервисдеск, поскольку это баг, который нужно исправить.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

Остановимся на ответе СервисДеска:

"При компиляции 1.mq5, внутри функции B() не понятно, какая из функций должна быть вызвана,
импортированная A() или экспортируемая A() - т.к. компилятор не понимает, что Вы имели ввиду одну и ту же функцию"

Они правы по форме - но при желании компилятору можно (и нужно) было бы подсказать что это одна и та же функция, поскольку повторюсь имя модуля на момент компиляции - доступно (указано в #import).

Тем более, что если сначала в одном месте поcтавить :: и скомпилировать, потом удалить и поставить :: в другом - то всё работает, но согласитесь - это очень неудобно и после 10-15 таких вынужденных перестановок я перешёл на #define

 
A100:

Остановимся на ответе СервисДеска:

"При компиляции 1.mq5, внутри функции B() не понятно, какая из функций должна быть вызвана,

импортированная A() или экспортируемая A() - т.к. компилятор не понимает, что Вы имели ввиду одну и ту же функцию"

Абсолютно точно, всё так и есть.


Они правы по форме - но при желании компилятору можно (и нужно) было бы посказать что это одна и таже функция, поскольку повторюсь имя модуля на момент компиляции доступно (указано в #import).

Для таких подсказок существует оператор разрешения контекста "::", однако в данном случае он не применим, поскольку имя модуля (файла) тоже совпадает.

Совет адекватный - изменить структуру программы. 

Тем более, что если сначала в одном месте поcтавить :: и скомпилировать, а потом удалить и поставить :: в другом - то всё работает, но согласитесь - это очень неудобно

Таких трюков лучше избегать.  Это не только неудобно но и "расово неверно",  "некошерно", "по уродски", и "на соплях".  Попытки обмануть компилятор имеют право на существование только если нет никаких других вариантов реализации задуманного.  В данном случае их масса.


и после 10-15 таких вынужденных перестановок я перешёл на #define

Не лучшее решение.  Параметризаванные дефайны полезны только когда контроль типов нежелателен, или когда вместо параметров подставляются "многословные" куски текста.  Как заменитель инлайн-функции дефайн безусловно вреден для здоровья программы. 

--

В твоём случае я бы отказался от использования .ex5-библиотек.  И всё бы со свистом заработало.  Практическая польза от них есть только в сокрытии реализации (при продаже), а в остальных случаях пользу от них не вижу.

Ты на продажу пишешь?

 
MetaDriver:

Ты на продажу пишешь?

Для себя.

Без .ex5 не получается. У меня ещё есть функции вида F( string& [] ), они как то в .dll не лезут :)

Можно их наверное как то через разделитель заталкивать, но пока не пробовал 

 
A100:
Просто в MQL5 нет inline функций (по форме) и я использую вместо них - параметрические макросы, что в общем не совсем правильно, поскольку отсутствует контроль типов

А еще, емнип, компилятор не оптимизирует выражения, поэтому получится дополнительный минус по скорости. Лучше сверьте.

Кстати насчет инлайнинга -- он работает. Из-за этого еще проблемы с дебаггером были.

 
TheXpert:

Кстати насчет инлайнинга -- он работает. Из-за этого еще проблемы с дебаггером были.

Так он работает на уровне компилятора. А хотелось бы на уровне языка. Приводил выше пример - через необъяснимый "обход компилятора" - всё работает, а напрямую - нужны дополнительные телодвижения, иногда существенные, поскольку как Вы советовали не включать описание и реализацию одной и той же функции в один файл можно конечно, но тогда 10 полноценных .mqh разбиваются уже на 100 более мелких .mqh

За скоростью пока не гнался. Главное - удобство и чтобы объем кода не рос в геометрической прогрессии.

Уже даже столкнулся с необходимостью применять в MQL5 аналоги #if #else (пока криво, но местами - работает)

 
A100:

За скоростью пока не гнался. Главное - удобство и чтобы объем кода не рос в геометрической прогрессии.

Ваше дело. Но, учитывая патологическую любовь метаквотов к ограничениям, существует далеко не нулевая вероятность, что с такими макросами вы таки парочку-другую граблей словите.
 

A100:

Без .ex5 не получается. У меня ещё есть функции вида F( string& [] ), они как то в .dll не лезут :)

....

Боже.. ..  :)

Я не предлагал использовать DLL вместо .ex5-библиотек.  Только многа-многа .mqh и  один исполняемый .mq5, больше ничего.

 
MetaDriver:

Только многа-многа .mqh и  один исполняемый .mq5, больше ничег

Я использую один код на 3 разных терминалах, значит минимум еще одна .ex5 (общая для всех) должна быть. А если так - то возвращаемся к проблеме описанной выше - там всего 2 модуля - но не компилируются нормально.
 
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )
Не работает в неторговое время. А что мешает в неторговое время поместить график поверх всех других ?
Причина обращения: