Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
hoz:
Хотите сказать, что в инклюдниках разных библиотек не бывает так чтоб они ссылались друг на друга?
Ведь есть какая-то библиотека, в которой функции общие типа ND (нормализация) или ещё какие-нить, и есс-но что её будут импортировать разные другие библиотеки, которые используют данную функцию, а также и другие какие-то. Получается логично, что это не является ошибкой. Но как фактически.. тут вопрос остаётся открытым. Я не въехал пока что... :(
У вас другая ситуация: получается, что внутри ex4 библиотеки есть импорт функции из этой же библиотеки. На момент, когда вы запускаете компилятор, он считает данные две функции (импортируемую и написанную в коде) разными объектами, ведь копия импортируемой функции подгрузится только в процессе выполнения программы.
По идее, разработчикам следовало бы внести рекурсивный импорт функций из ex4 библиотек в список ошибок компилятора, чтобы предотвратить подобные ситуации. Но в принципе, они уже отлавливаются сообщением о неправильной перегрузке.
Формализованным математически языком можно сформулировать так: ориентированный граф импорта не должен содержать циклов, проходящих через ex4-библиотеки.
И как же тогда быть? Ведь написано то всё вроде как корректно.
... написано то всё вроде как корректно.
Не думаю.
1. Кто виноват:
Дело в том, что корректность библиотечных функций в MQL4 не проверяется при компиляции,- т.н. "позднее присоединение".
Это означает, что при обращении к этой функции она либо будет выполнена (корректно или нет), либо остановит выполнение всей программы до повторной инициализации, как повезет. Поэтому компилятор четверки - не совсем компилятор, а еще и немного интерпретатор.
Далее догадки. Как я понимаю, компилятор MQL5 работает иначе, по крайней мере в этом случае. Он полез в библиотеку1, нашел эту функцию и с недоумением обнаружил, что она содержится в библиотеке2, которая, в свою очередь обращается к библиотеке1, ну и все такое... При этом функции идентичны, как и набор их параметров (... same parameters ...), поэтому разрешить конфликт, предполагая перегруз ну никак не получается. О чем и сообщил:)))
Короче: "... Волки от испуга скушали друг друга ...".
2. Что делать:
Наведите порядок в своих библиотеках. Если в библиотеке размещены статистические функции, то в ней не должно быть геометрии; ну или сделайте свою единственную библиотеку на все случаи жизни.
На правах имхенько.
И как же тогда быть? Ведь написано то всё вроде как корректно.
Самый простой вариант - 1) сделать из ex4 библиотеки заголовочный mqh файл. 2) в инклюде, который импортировал из библиотеки замнить импорт на включение 3) если все еще нужна именно ex4 библиотека, то создать отдельный MQ4 файл - с другим именем - и включить в него полученный из старой библиотеки заголовок. Цикл разорван, должно откомпилироваться.
А вообще, если у вас много библиотек, полезно держать граф включений и импортов в нарисованном виде, в каком-нибудь Visio. Составить его будет несложно.
И как же тогда быть? Ведь написано то всё вроде как корректно.
Как вариант - такой стандартный способ контроля однократного включения инклудов:
Имена переменных в директиве препроцессора должно быть уникальным для каждого инклуда
Имена переменных в директиве препроцессора должно быть уникальным для каждого инклуда
Наверное, так и должно быть, решил я, не сумев понять сути:(
Это условная директива препроцессора. Если переменная не определена (#ifndef), то препроцессор (это такая штука, что обрабатывает #define и остальные директивы со значком # и происходит это на этапе до компиляции кода) ее определяет и включает инклуд. Следующий раз в этом проекте переменная будет определена и повторного включения инклуд-файла не произойдет. Есть еще #ifdef. Любая условная директива закрывается #endif. Появились в MQL++. А в C/C++ - это стандарт.
Это условная директива препроцессора. Если переменная не определена (#ifndef), то препроцессор (это такая штука, что обрабатывает #define и остальные директивы со значком # и происходит это на этапе до компиляции кода) ее определяет и включает инклуд. Следующий раз в этом проекте переменная будет определена и повторного включения инклуд-файла не произойдет. Есть еще #ifdef. Появились в MQL++. А в C/C++ - это стандарт.
Да я не про директиву, но спасибо.
По поводу уникальности имен переменных ?
Если да, то там так: если в нескольких инклудниках будет одинаковое имя (пусть в a,b,c), то при необходимости включить все,
после включения первого в списке (а), препроцессор определит переменную и все остальные инклудники по списку (b,c) включены не будут.