Ошибки, баги, вопросы - страница 1440

 

МТ 4. Генератор случайных чисел MathRand()  внутри OnTick().  При тестировании совы получаются разные результаты при повторном запуске на одинаковых настройках. Это естественно если сгенерированное число влияет на алгоритм.

При оптимизации почему-то выдаются одинаковые результаты при повторном запуске с теми-же настройками. Получается MathRand() не работает в режиме оптимизации?  

 
Сергей Таболин:

Второе (тут я боюсь ошибиться, надеюсь Alexander Puzanov меня поправит, если что), если программист по каким либо причинам решает добавить к динамическому массиву элемент с индексом 20, то ничего страшного не произойдёт. Массив примет эту размерность и запишет туда значение, а "недостающие" индексы проинициализирует нулевыми значениями.

Вот-вот. Почему "нулевыми" ??? А может быть, это должны быть EMPTY_VALUE ? Или WRONG_VALUE ?

Проблема подобных неявных присвоений именно в их неявности - компилятор вносит какой-то код, про который один программист думает одно, а другой - может думать другое.

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

И трейтье, никто ведь не мешает программисту контролировать размерность и используемый индекс! Отличие только в том, что сейчас это делать вынуждают! ))) 

Если компилятор будет сам следить за размерностью массива - никакой класс не сможет убрать этот код. Эффективность может сильно падать.

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

Во втором случае - гибкость выше.

То есть, то, что предлагаете вы - это тоже вполне себе годное решение для многих случаев. Но оно может снижать эффективность, что не есть хорошо.

 
Сергей Таболин:

Это, в принципе, простой пример как по нормальному должен заполняться динамический массив. На С я очень давно не писал, не помню, но в php массивы именно так и заполняются! Всё логично и понятно. Если я добавляю элемент в массив (arr[] = x), то массив автоматически увеличивается, и элемент добавляется в конец массива. И не нужно самому растягивать его, и не нужно самому указывать индекс элемента. Здесь же нам приходится делать совершенно лишние движения:

разница очевидна...

на мой взгляд это, по меньшей мере, странно ))) 

Языки программирования делятся на строготипизированные и нет. К нестроготипизированным относится ваш PHP, R и другие функциональные языки. В строготипизированных языках как MQL или C# и Java подобные неоднозначные манипуляции с данными недопустимы. И сделано это специально для безопасности самого же программиста. Строгая типизация подразумевает что каждая ваша процедура предельно конкретна: "взять элемент по индексу 0 в массиве array" - конкретная и понятная процедура, Вы же предлагаете ее заменить на "взять что-нибудь из массива array и сложить с чем-нибудь, что первое решит вернуть компилятор". - Согласитесь, что далеко на этом не уедешь.

С другой стороны, конечно, хотелось бы простых высокоуровневых конструкций, без утомительных выяснений размеров массива и постоянных пользовательских переразметок. Вот именно для этого и существует стандартная библиотека. Вместо того, что бы использовать базовые массивы переходите на классы группы Array. Вот так например будет выглядеть добавление от нуля до 16 в массив CArrayInt:

#include <Arrays\ArrayInt.mqh>

void OnStart()
{
   CArrayInt array;
   for(int i = 0; i < 16; i++)
      array.Add(i);   
}

 Как видите, ничего сверх естественного нет. И ненужно голову ломать над текущем размером массива и прочими переразметками. Все делается за Вас, в рамках строгой типизации, а Вам предлагается сосредоточиться непосредственно над пользовательской задачей. В этом мощь и смысл ООП.

 

Недоступна полная запись. Ошибка компиляции

template<typename T>
class A { protected:
        A( T t ) : t( t ) {}
        T t;
};
class B : A<int> {
        B() : A<int>( 1 ) {} //'<' - member(s) initialization expected
};
 

Не могу найти гдя я ошибаюсь.

Задача - найти максимальное и минимальное значение на интервале

void OnStart()

  {
int            Kol_Kan=10;       //Количество элементов для копирования
double         HI[];             //массив для хранения максимумов на интервале
double         LO[];             //массив для хранения минимумов на интервале

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов
CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива
ArrayResize(LO,Kol_Kan);

int in_max=0;                    //индекс максимального значения в массиве
int in_min=0;

in_max=ArrayMaximum(HI,WHOLE_ARRAY,0); //Находим индексы максимума и мин в массивах
in_min=ArrayMinimum(LO,WHOLE_ARRAY,0);

double hi_max;                   // максимальное значение цены 
double lo_min;                   // минимальное значение цены

hi_max=HI[in_max];               //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert(hi_max,"___",lo_min);   

  } 
 

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

 
PabloEs:

Не могу найти гдя я ошибаюсь.

Задача - найти максимальное и минимальное значение на интервале

 Функции 

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов  

CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

уже ресайзят массив... 

Это лишнее 

 ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива

ArrayResize(LO,Kol_Kan);

 

 
Sergei Vladimirov:

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

Точно)) А я то думаю...

Vladimir Pastushak:

 Функции 

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов  

CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

уже ресайзят массив... 

Это лишнее 

 ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива

ArrayResize(LO,Kol_Kan);

 

Буду знать, спасибо. 

 
PabloEs:
так в чем ошибка то чет я сам не могу понять ?
 

А вот автор понял уже. ))

PabloEs:

Точно)) А я то думаю... 

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