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

 
uncleVic:
И об этом напишите в СД. Мол "не всё, то что есть в обзоре можно выбрать в тестере".
Не, отбой. У меня два терминала открыто - Альпари, и МК, и туда сюда переключался, вот в последний я забыл добавить EURGBP в обзор рынка.
 
marketeer:
Не, отбой. У меня два терминала открыто - Альпари, и МК, и туда сюда переключался, вот в последний я забыл добавить EURGBP в обзор рынка.
Бывает.
 

Пытаюсь в скрипте создать массив, который бы вёл себя как индикаторная серия. А именно при появлении новой записи весь массив сдвигается назад, а новая запись делается на нулевую позицию.

void OnStart()
  {
   int a[];
   int size=5;               // размер массива
   bool flag=true;           // флаг направления индексации
   ArraySetAsSeries(a,flag);  // зададим направление индексации
   ArrayResize(a,size);      // зададим размер массива
//---
   for(int i=0;i<size;i++)  // задаём значения и распечатываем массив
      a[i]=size-i;         // 54321
   Print("[",a[0],"][",a[1],"][",a[2],"][",a[3],"][",a[4],"]");
//---
   ArrayResize(a,size-1);     // уменьшаем размер 5432
   ArraySetAsSeries(a,!flag);  // меняем направление индексации 2345
   ArrayResize(a,size);       // возвращаем в исходный размер  2345х
   ArraySetAsSeries(a,flag);   // возвращаем в исходную индексацию х5432   
   a[0]=6;                   // задаём "пустому" нулевому данному значение
//---
   Print("[",a[0],"][",a[1],"][",a[2],"][",a[3],"][",a[4],"]");
   // в результате получаем 64321 вместо нужного 65432
  }

Как говорится why?

ЗЫ не хочу огульно обвинять, может я чего напутал, но первое что приходит на ум очередной баг оптимизации языка.

ЗЗЫ Прошу товарисчей которые хотят посоветовать сдвинуть данные циклом не беспокоится, этот вариант хорошо работает на массивах 5...100...1000..., но при больших размерах массива неприемлем.

 
Urain:

Пытаюсь в скрипте создать массив, который бы вёл себя как индикаторная серия. А именно при появлении новой записи весь массив сдвигается назад, а новая запись делается на нулевую позицию.

Как говорится why?


А если взять class CArrayInt, и инсертом туда запихивать данные?
 
uncleVic:
А если взять class CArrayInt, и инсертом туда запихивать данные?

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

Опять же насколько я помню, этот метод как раз и занимается смещением данных в цикле а это довольно медленно.

 
Urain:

Пытаюсь в скрипте создать массив, который бы вёл себя как индикаторная серия. А именно при появлении новой записи весь массив сдвигается назад, а новая запись делается на нулевую позицию.

Как говорится why?

ЗЫ не хочу огульно обвинять, может я чего напутал, но первое что приходит на ум очередной баг оптимизации языка.

ЗЗЫ Прошу товарисчей которые хотят посоветовать сдвинуть данные циклом не беспокоится, этот вариант хорошо работает на массивах 5...100...1000..., но при больших размерах массива неприемлем.


На счёт "ЗЗЫ": Ваши ресайзы Вам память не обфрагментируют?
 
uncleVic:
На счёт "ЗЗЫ": Ваши ресайзы Вам память не обфрагментируют?

Другой функции (которая распределяет память) в mql5 не знаю.

ЗЫ Да и насколько я понял направление массива тоже чисто виртуальная вещь.

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

 
Urain:

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

Опять же насколько я помню, этот метод как раз и занимается смещением данных в цикле а это довольно медленно.

Нужно будет подумать над улучшением классов-массивов (мне).
 
uncleVic:
Нужно будет подумать над улучшением классов-массивов (мне).

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

Всё таки плохо что с памятью напрямую нельзя работать, там хорошое ускорение при виртуализации, даже в С++ скорость в 1.5 раза прирастает если обращаться не к массиву а к ячейке по адресу.

 
Urain:

Пытаюсь в скрипте создать массив, который бы вёл себя как индикаторная серия. А именно при появлении новой записи весь массив сдвигается назад, а новая запись делается на нулевую позицию.

ЗЗЫ Прошу товарисчей которые хотят посоветовать сдвинуть данные циклом не беспокоится, этот вариант хорошо работает на массивах 5...100...1000..., но при больших размерах массива неприемлем.


А можно таки посоветовать весь массив не двигать? :)

Динамический массив, новые данные в конец пишутся, размер меняется/запоминается, а флаг AsSeries меняет только индексацию.

Для нормального порядка обращение к N элементу массива, для "серийного" Size-N-1.

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
Причина обращения: