Задачник по MQL5 (с ответами)

 

Предлагаю проверить свои знания языка MQL5 и решить простые задачи:

ЗадачаВопросОтвет
1
double    Close[];
//---
void OnStart()
  {
   ArrayResize(Close,100,100);
   CopyClose(_Symbol,_Period,0,1,Close);
   Print(ArraySize(Close));
  }

 1. Какое сообщение будет напечатано оператором?

   Print(ArraySize(Close));


 2. Нужен ли оператор

   ArrayResize(Close,100,100);
 1. (1)
 2. (нет)
2
double    Close[];
//---
void OnStart()
  {
   CopyClose(_Symbol,_Period,0,100,Close);
   CopyClose(_Symbol,_Period,0,1,Close);
   Print(ArraySize(Close));
  }
 1. Какое сообщение будет напечатано оператором?
   Print(ArraySize(Close));
 1. (1)
3
double    Close[];
//---
void OnStart()
  {
   CopyClose(_Symbol,_Period,0,100,Close);
   CopyClose(_Symbol,_Period,0,1,Close);
   Print(Close[1]);
  }
 1. Есть ли ошибка в коде?
 2. Как получить значение элемента массива за его пределами (в данной задаче)?
 1. (Да. Обращение к элементу за пределами размерности массива. "array out of range" )
   Print(Close[1]);
 2. (Добавить оператор)
double    Close[];
//---
void OnStart()
  {
   CopyClose(_Symbol,_Period,0,100,Close);
   CopyClose(_Symbol,_Period,0,1,Close);
   ArrayResize(Close,100,100);
   Print(Close[1]);
  }

ВЫВОД: функции типа Copy...()  изменяют размер динамического массива по своему усмотрению исходя из количества запрашиваемых данных. Однако, при сокращении количества копируемых элементов в процессе выполнения программы, доступ к значениям за пределами размерности всё-таки возможен.

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - Документация по MQL5
 

 

 Задача 3. 2. Как получить значение элемента массива за его пределами (в данной задаче)?

 

Правильнй ответ - не нужно и пытаться.

 
DC2008:

ВЫВОД: функции типа Copy...()  изменяют размер динамического массива по своему усмотрению исходя из количества запрашиваемых данных. Однако, при сокращении количества копируемых элементов в процессе выполнения  программыдоступ к значениям за пределами размерности всё-таки возможен.

1. это в документации написано: "если данных оказывается меньше (или больше), чем вмещает массив, то производится попытка перераспределения массива таким образом, чтобы запрошенные данные поместились целиком и полностью"

2. похоже выход за пределы массива не отслеживается, аккуратней с такими "возможностями".

 
DC2008:

ВЫВОД: функции типа Copy...()  изменяют размер динамического массива по своему усмотрению исходя из количества запрашиваемых данных. Однако, при сокращении количества копируемых элементов в процессе выполнения программы, доступ к значениям за пределами размерности всё-таки возможен.

Вывод не совсем правильный. Они изменяют видимый размер массива, без реаллокации. Поэтому данные будут доступны только в том случае, если ArrayResize не приведет к выделению нового куска памяти.

Мало того, это поведение нигде не описано, следовательно использоваться не может.

Короче. Ответ на вопрос 3.2 не совсем корректен, как собственно и сам вопрос.

 
Классная тема, требую продолжения, этакий учебник/сборник практических заданий
 

Тут просто обязана быть пачка вопросов про double

ЗадачаВопросОтвет
1
Print(MathMod(0.3, 0.1));

Что распечатает функция  Print?
1) 0
2) 0.1
2)
 
TheXpert:

Тут просто обязана быть пачка вопросов про double

Задача Вопрос Ответ
1
Что распечатает функция  Print?
1) 0
2) 0.1
2)
А это, случаем, не в сервисдеск отписывать надо?
 
Contender:
А это, случаем, не в сервисдеск отписывать надо?
Не. Неожиданно, не правда ли? Я по этой причине этой функцией не пользуюсь -- потенциальный гемор перевешивает.
 
TheXpert: Не. Неожиданно, не правда ли? Я по этой причине этой функцией не пользуюсь -- потенциальный гемор перевешивает.

Да можно ей пользоваться - для целочисленных данных. Никаких сюрпризов не будет.

Ну а для нецелочисленных, конечно, будут - из-за фишек, связанных с представлением данных.

 
TheXpert:
Не. Неожиданно, не правда ли? Я по этой причине этой функцией не пользуюсь -- потенциальный гемор перевешивает.

В других программах расчёт (остатка от деления) тоже хромает:

 

 
DC2008:

В других программах расчёт (остатка от деления) тоже хромает:

MS office (кстати лицензию купили? ))) ) и MQL4 используют одну и ту же функцию библиотеки MSVC6 которая называется fmod. В ней ошибка. 
т.е. делаете ли вы это в офисе или в mql4, вы делаете одно и тоже. 

читать вот это: https://www.mql5.com/ru/articles/1561 в конце.

Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
Причина обращения: