Вопросы, касаемые нового билда... - страница 3

 

hoz:

Хотите сказать, что в инклюдниках разных библиотек не бывает так чтоб они ссылались друг на друга?

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


У вас другая ситуация: получается, что внутри ex4 библиотеки есть импорт функции из этой же библиотеки. На момент, когда вы запускаете компилятор, он считает данные две функции (импортируемую и написанную в коде) разными объектами, ведь копия импортируемой функции подгрузится только в процессе выполнения программы.


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

 
Формализованным математически языком можно сформулировать так: ориентированный граф импорта не должен содержать циклов, проходящих через ex4-библиотеки.
 
alsu:
Формализованным математически языком можно сформулировать так: ориентированный граф импорта не должен содержать циклов, проходящих через ex4-библиотеки.

И как же тогда быть? Ведь написано то всё вроде как корректно.
 
hoz:

... написано то всё вроде как корректно.


Не думаю.

1. Кто виноват:

Дело в том, что корректность библиотечных функций в MQL4 не проверяется при компиляции,- т.н. "позднее присоединение".

Это означает, что при обращении к этой функции она либо будет выполнена (корректно или нет), либо остановит выполнение всей программы до повторной инициализации, как повезет. Поэтому компилятор четверки - не совсем компилятор, а еще и немного интерпретатор.

Далее догадки. Как я понимаю, компилятор MQL5 работает иначе, по крайней мере в этом случае. Он полез в библиотеку1, нашел эту функцию и с недоумением обнаружил, что она содержится в библиотеке2, которая, в свою очередь обращается к библиотеке1, ну и все такое... При этом функции идентичны, как и набор их параметров (... same parameters ...), поэтому разрешить конфликт, предполагая перегруз ну никак не получается. О чем и сообщил:)))

Короче: "... Волки от испуга скушали друг друга ...".

2. Что делать:

Наведите порядок в своих библиотеках. Если в библиотеке размещены статистические функции, то в ней не должно быть геометрии; ну или сделайте свою единственную библиотеку на все случаи жизни.

На правах имхенько.

 
hoz:

И как же тогда быть? Ведь написано то всё вроде как корректно.

Самый простой вариант - 1) сделать из ex4 библиотеки заголовочный mqh файл. 2) в инклюде, который импортировал из библиотеки замнить импорт на включение 3) если все еще нужна именно ex4 библиотека, то создать отдельный MQ4 файл - с другим именем - и включить в него полученный из старой библиотеки заголовок. Цикл разорван, должно откомпилироваться.

А вообще, если у вас много библиотек, полезно держать граф включений и импортов в нарисованном виде, в каком-нибудь Visio. Составить его будет несложно.

 
hoz:

И как же тогда быть? Ведь написано то всё вроде как корректно.

Как вариант - такой стандартный способ контроля однократного включения инклудов:

#ifndef ___MY_01_INCLUDE
#define ___MY_01_INCLUDE

// код Вашего инлкуда

#endif

Имена переменных в директиве препроцессора должно быть уникальным для каждого инклуда

 
VladislavVG:

Имена переменных в директиве препроцессора должно быть уникальным для каждого инклуда

Наверное, так и должно быть, решил я, не сумев понять сути:(
 
tara:
Наверное, так и должно быть, решил я, не сумев понять сути:(


Это условная директива препроцессора. Если переменная не определена (#ifndef), то препроцессор (это такая штука, что обрабатывает #define и остальные директивы со значком # и происходит это на этапе до компиляции кода) ее определяет и включает инклуд. Следующий раз в этом проекте переменная будет определена и повторного включения инклуд-файла не произойдет. Есть еще #ifdef. Любая условная директива закрывается #endif. Появились в MQL++. А в C/C++ - это стандарт.
 
VladislavVG:

Это условная директива препроцессора. Если переменная не определена (#ifndef), то препроцессор (это такая штука, что обрабатывает #define и остальные директивы со значком # и происходит это на этапе до компиляции кода) ее определяет и включает инклуд. Следующий раз в этом проекте переменная будет определена и повторного включения инклуд-файла не произойдет. Есть еще #ifdef. Появились в MQL++. А в C/C++ - это стандарт.
Да я не про директиву, но спасибо.
 
tara:
Да я не про директиву, но спасибо.


По поводу уникальности имен переменных ?

Если да, то там так: если в нескольких инклудниках будет одинаковое имя (пусть в a,b,c), то при необходимости включить все,

#include <a.mqh>
#include <b.mqh>
#include <c.mqh>

после включения первого в списке (а), препроцессор определит переменную и все остальные инклудники по списку (b,c) включены не будут.