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

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 )
Не работает в неторговое время. А что мешает в неторговое время поместить график поверх всех других ?
A100:
Не работает в неторговое время. А что мешает?

А вы уверены в параметрах? 

Оба примера выглядят ошибочно:

ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )  - последний параметр должен быть long&, а не bool
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )     - последний параметр должен быть номер подокна, а не bool

Похоже, что спутали с ChartSetInteger?

Renat:

А вы уверены в параметрах? 

Оба примера выглядят ошибочно:

Похоже, что спутали с ChartSetInteger?

Да, извините, неправильно перенес из своего кода - не работает в неторговое время
bool bringToTop = true;
ChartSetInteger( chart_ID, CHART_BRING_TO_TOP, 0, bringToTop ) 
ChartSetInteger( chart_ID, CHART_BRING_TO_TOP, true )
//этим хотел показать что пробовал оба варианта
ChartGetInteger и не должен работать, поскольку CHART_BRING_TO_TOP - write only. Исправлю заявку в СервисДеск