Бета версия онлайновой книги по программированию на MQL4 - автор Сергей Ковалев (SK.) - страница 10

 
Прошу прощения, нашел!
Да, пособие действительно классное, но возвращаясь к своей ранней просьбе - его нужно иметь под рукой, чтобы иметь возможность оперативно заглядывать.
В идеале - им нужно заменить стандартный help в новых версиях МТ.
 

to SK

double my_search_and_etc()
{ double summ[]; //массив внутри функции
//.........
i=ArrayMinimum(summ,iter,0); // Трассировщик: <incorrred start position 0 for ArrayMinimum function>

//второй варианат ошибки
static double summ[]; //
//.........
i=ArrayMinimum(summ,iter,0); // Трассировщик: <incorrred start position 0 for ArrayMinimum function>
//т.е. Ошибка динамической адресации начального элемента массива на втором тике
//.......................

//........................
// пhавильно раз
double summ[1000]; //указание явного размера влечет тип static
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
//правильно два
static double summ[1000]; //перестраховка к явному размеру
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
}

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

to SK


Не очень понятно о чём вопрос. Представленный Вами набор строк - это законченный код (тогда почему повторяется инициализация?) или обрывочные строки (тогда зачем там фигурные скобки?). Представьте законченный код и сформулируйте вопрос. Для публикации кода используйте кнопку MQL ( в верхней строке окна редактирования).
 
Renat:
Поздравляю Сергея Ковалева!

Релиз учебника по языку MQL4 назначен на 1 февраля и он уже интегрирован в сайт MQL4.community. Перевод на английский язык идет полным ходом.

Спасибо за поздравление, Ренат.

Пользуясь случаем, хочу ещё раз сказать, что публикация учебника по MQL4 на сайте MetaQuotes Software Corp. для меня большая честь. Я искренне благодарен Вам за доверие, поддержку и всемерное содействие. Благодарю также сотрудников компании Станислава Старикова и Рашида Умарова за ценные консультации и помощь при подготовке учебника.

 
to SK
Приведены 4 варианта инициализации массива с одим и тем же вызовом ArrayMinimum();
Показано, что инициализация массива в подпрограмме без указания размерности массива [] приводит к ошибке "RunTime"
- первые два варианта, ошибка процитирована, в переводе: "некорректный АДРЕС начала массива."
-вторые два варианта рабочие, показано, что укaзаниe размерности [1000] автоматически делает массив статическим.
Выводы:
1) массивы MQL4 не всегда статические,
2)определение static a[] т.е. без явной размерности не выполняется, но предупреждения об ошибке нет. Ошибка вылазит runtime на втором и последующем тике в окне эксперты.
3) Описаные ошибки статики/динамики проявляются если массив определен в sub/func и ловятся только теми кто смотрит в окно "эксперты",
и только тогда когда приходит второй тик. Например, ошибка не обнаружится при отладке индикатора в выходные без применения тестера стратегий.
4) Строка из учебника, якобы "массивы MQL4 всегда статические" может быть относится к ранним сборкам.
 

Хотелось бы помимо текстовых обучающих пособий. Иметь набор видео уроков. Особенно нахватает одного самого первого урока - как скачать, установить программу и сделать первую сделку Buy или Shell .

 
Korey:
to SK
Приведены 4 варианта инициализации массива с одим и тем же вызовом ArrayMinimum();
Показано, что инициализация массива в подпрограмме без указания размерности массива [] приводит к ошибке "RunTime"
- первые два варианта, ошибка процитирована, в переводе: "некорректный АДРЕС начала массива."
-вторые два варианта рабочие, показано, что укaзаниe размерности [1000] автоматически делает массив статическим.
Выводы:
1) массивы MQL4 не всегда статические,
2)определение static a[] т.е. без явной размерности не выполняется, но предупреждения об ошибке нет. Ошибка вылазит runtime на втором и последующем тике в окне эксперты.
3) Описаные ошибки статики/динамики проявляются если массив определен в sub/func и ловятся только теми кто смотрит в окно "эксперты",
и только тогда когда приходит второй тик. Например, ошибка не обнаружится при отладке индикатора в выходные без применения тестера стратегий.
4) Строка из учебника, якобы "массивы MQL4 всегда статические" может быть относится к ранним сборкам.


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

Массивы в MQL4 являются статическими по определению. Это значит (разумеется, для тех случаев, когда в массиве имеется по крайней мере один элемент), что значения элементов массивов сохраняются в период от момента предыдущего завершения функции (в кот. объявлен массив) до момента очередного обращения к ней независимо от того, имеется ли перед идентификатором массива ключевое слово static.

 
to SK
Мне то что, мы эти фокусы распределения памяти давно юзаем.
Мною написано не о содержимом массива но об его адресации, о том. что ошибки компиляции нет, ошибок линковки нет, а рантайм еррор АДРЕСА есть.
Т.е. компилятор мне разрешил определить в подпрограмме массив [] для его последующего выращивания, - это хорошо (!),
это динамическое выделение памяти по массив.
Однако, все указатели на этот массив отлинкованы как прямые указатели (но не указатели на указатели),
что при последующем динамическом выделении памяти приводит к несовпадению отлинкованных статических адресов с новым выделенным адресом массива.
Т.е. ссылка на массив (указатель) в MQL4 сейчас статическая и работает правильно только тогда, когда массив действительно статический.
Компилятор не сечет, что массив на вырост без явного размера внутри подпрограммы будет в дальнейшем перемещаться.
Программер ставит static и думает. что все правильно, но если им не указан явный размер - никакого ему статического массива, а массив реально окажется динамическим (без ошибок компиляции/загрузки).
Проблема не такая уж большая, обычно все держат массивы на уровне глобальных.
Но в учебнике желательно прописать не то что якобы все массивы уже статические,а то что нужно прописывать локальные массивы статическими с явным размером.
 
Korey:
to SK
Программер ставит static и думает. что все правильно, но если им не указан явный размер - никакого ему статического массива, а массив реально окажется динамическим (без ошибок компиляции/загрузки).

Програмёр, знающий, что в MQL4 все массивы статические, не станет ставить static просто потому, что в этом нет необходимости.

Но в учебнике желательно прописать не то что якобы все массивы уже статические,а то что нужно прописывать локальные массивы статическими с явным размером.

Возможно, Вы путаете понятия. В данном случае "статический" означает свойство сохранять значения элементов массива в промежутке между исполнениями функции, в кот. он объявлен. Массивы всегда сохраняют свои значения в течение этого времени независимо от факта наличия записи static перед названием (однако, это не справедливо для локальных переменных, для них требуется явно указывать static).

В то же время имеется возможность изменить размерность массива в первом измерении с помощью функции ArrayResize().

Причина обращения: