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

 
VladislavVG:

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

#ifndef ___MY_01_INCLUDE
#define ___MY_01_INCLUDE

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

#endif

С каких пор подобный подход работает в МКЛ4 ? Знаю что в С++ это уже стандарт, но чтоб в МКЛ4... Первый раз вижу.
VladislavVG:

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

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

hoz:

#ifndef ___MY_01_INCLUDE
#define ___MY_01_INCLUDE

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

#endif
С каких пор подобный подход работает в МКЛ4 ? Знаю что в С++ это уже стандарт, но чтоб в МКЛ4... Первый раз вижу.
Может уже справку почитаешь?

Этот древний "стандарт" давно на

#pragma once
заменили.
 
alsu:

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

Самый простой разумеется будет так, но... нам не нужны самые простые пути :) Хочется всё-таки работать с библиотеками, что в общем-то логично.

alsu:

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

Я тоже подумал, что придётся либо разбить существующие библиотеки на более мелкие, либо отделить инклюд от импорта и в библиотеку саму инклюдить инклюд другой тот где нет импорта библиотек, который в самой библиотеке имеются. Так не будет повторный объявлений. Так имеете ввиду?

alsu:

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

Я первый раз про это слышу. Увидеть бы как это делается по уму было бы нагляднее. А так я лишь догадываюсь что так как-то визуально всё видно как библиотеки будут взаимодействовать и не более того.

 
Zhunko:

Может уже справку почитаешь?

Этот древний "стандарт" давно на

заменили.

Все наши инлюдники имеют автоматическое условие однократного включения и им не нужны ни старые ifdef, ни pragma once.

Так было всегда во всех MQL языках.

В то же самое время #ifdef условия поддерживаются в MQL4/MQL5.

 
Renat:

Все наши инлюдники имеют автоматическое условие однократного включения и им не нужны ни старые ifdef, ни pragma once.

Так было всегда во всех MQL языках.

Спасибо! Классно!

Только одна неприятность от этого. Когда действительно необходимо пару раз инклюд вставить, то хрен вставишь :-))

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

В С++ это просто, а в MQL так не сделать.

 
Zhunko:

Спасибо! Классно!

Только одна неприятность от этого. Когда действительно необходимо пару раз инклюд вставить, то хрен вставишь :-))

;)

Есть такая фигня. Жутко противная. Если б не она, я б давно себе параметризованные классы настрогал.

 
hoz:

Я первый раз про это слышу. Увидеть бы как это делается по уму было бы нагляднее. А так я лишь догадываюсь что так как-то визуально всё видно как библиотеки будут взаимодействовать и не более того.


Алгоритм такой:

1) Берем файл, рисуем квадратик (если для этого файла еще квадратика нет). Смотрим, какие файлы в него включаются и импортируются, рисуем для каждого свой квадратик (опять же, если еще не нарисован) и стрелочки к ним к исходного файла.

2) Если файлы не закончились, переходим к пункту 1.

В нашем случае можно для наглядности рисовать квадратик для MQH и кружочек для EX4. Главное соблюдать направление стрелочек: либо везде от включаемого к включающему, либо наоборот.

 

В статье  сказано, что:

Следует отметить, что теперь константные массивы (Time[], Open[], High[], Low[], Close[], Volume[]) не могут быть переданы по ссылке. Например, вызов:

ArrayAverage(Open);

Вне зависимости от режима компиляции приводит к ошибке.


Рис.10. Ошибка 'Open' - constant variable cannot be passed as reference

Для устранения подобных ошибок нужно скопировать необходимые данные из константного массива:   

//--- массив для хранения значений цен открытия
 double OpenPrices[];
 //--- копируем значения цен открытия в массив OpenPrices[]
 ArrayCopy(OpenPrices,Open,0,0,WHOLE_ARRAY);
 //--- вызываем функцию
 ArrayAverage(OpenPrices);
Что послужило причиной? Ведь гораздо логичнее получать цены из массива-таймсерии, а не через промежуточный массив.
 
hoz:

В статье сказано, что:

Следует отметить, что теперь константные массивы (Time[], Open[], High[], Low[], Close[], Volume[]) не могут быть переданы по ссылке. Например, вызов:

Вне зависимости от режима компиляции приводит к ошибке.


Рис.10. Ошибка 'Open' - constant variable cannot be passed as reference

Для устранения подобных ошибок нужно скопировать необходимые данные из константного массива:

Что послужило причиной? Ведь гораздо логичнее получать цены из массива-таймсерии, а не через промежуточный массив.
Скорее всего, это обращение к члену структуры в массиве структур. Они же не подряд идут.