Вопрос по массивам к знатокам MQL4.

 

Подскажите, пожалуйста!

Есть ли какой-нибудь ресурсосберегающий способ в MQL4 сдвинуть данные в массиве на 1?

При рассмотрении вопроса: что выбрать память или быстродейсствие? Выбираем быстродействие в ущерб памяти.

.

P.S. Цикл не предлагать.

 

Например копирование в другой массив со сдвигом...

 
VBAG писал(а) >>

Подскажите, пожалуйста!

Есть ли какой-нибудь ресурсосберегающий способ в MQL4 сдвинуть данные в массиве на 1?

При рассмотрении вопроса: что выбрать память или быстродейсствие? Выбираем быстродействие в ущерб памяти.

.

P.S. Цикл не предлагать.

Если последовательность данных не имеет значения, то можно перемещать Указатель на последний элемент. Тогда и массив трогать не надо.

 

Ай да спасибочки!

То что нужно!

.

///////////////
void start() //
{
   int a[5]={1,2,3,4,5};
   int b[5]={1,2,3,4,5};
   ArrayCopy(a,b,0,1,4);
   Alert("Массив a[5]={",a[0],a[1],a[2],a[3],a[4],"}"); 
   return;
}
///////////////

.

Вопрос снят!

 
Vinin писал(а) >>

Если последовательность данных не имеет значения, то можно перемещать Указатель на последний элемент. Тогда и массив трогать не надо.

Виктор, не совсем понял Вышу мысль?

 
VBAG писал(а) >>

Виктор, не совсем понял Вышу мысль?

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

Можно конечно точно так же двигаться в обратную сторону. Зависит от вкуса и порядка формирования массива.

 
Циклический буфер, кажется, называется.
 
Vinin писал(а) >>

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

Можно конечно точно так же двигаться в обратную сторону. Зависит от вкуса и порядка формирования массива.

А, понятно! Я думал об этом, но в таком случае надо было бы массив с большим запасом делать.

Все-таки склонюсь к использованию встроенной функции.

Спасибо.

 
VBAG писал(а) >>

А, понятно! Я думал об этом, но в таком случае надо было бы массив с большим запасом делать.

Все-таки склонюсь к использованию встроенной функции.

Спасибо.

Запаса массива не нужно. Ровно столько, сколько нужно. И ускорение работы дает существенное. Все операции с массивами занимают довольно продолжительное время (относительно конечно).

 
Vinin писал(а) >>

Запаса массива не нужно. Ровно столько, сколько нужно. И ускорение работы дает существенное. Все операции с массивами занимают довольно продолжительное время (относительно конечно).

Значит, я сначала не так думал. Т.е. после того как массив заканчивается начинаем сначала пререзаписывать элементы массива вновь пришедшими данными(по кольцу) ! Понятненько!

Безусловно получается, что это самый быстый способ! Так..., вот теперь надо правильно организовать формирование указателя на нужный элемент и все будет пучком.

Еще раз всех благодарю.

 

есть еще одно оригинальное решение..

индекс 0,1,2,3,4,5,6,7,8

данные 1,2,3,4,5,6,7,8,9

First Point Index 0

Last Point Index 1

для того что бы работать с таким массивом необходимо просто контролировать положение указателей fist и last

через функции получения доступа к определеному индексу массива..

при этом при записи нового элемента указатель первого и последнего производит смещение на один..

подобная схема массива это FILO первый вошел последний вышел..

на пример при записи двух новых элементов

First Point Index 2

Last Point Index 3

при этом 9 элементом массива будет индекс 3

а 0 элементом индекс 2

Вот код смены индекса

//--------------------------------- MathCyclePrext -----------------------------------
// Cycle Countter to Prev or Next
int MathCyclePrext(int Index,int iIncrease,int iMaxIndex,int iMinIndex)
{
Index=Index+iIncrease;
while (Index<iMinIndex) Index=iMaxIndex-(iMinIndex-Index)+1;
while (Index>iMaxIndex) Index=iMinIndex+(Index-iMaxIndex)-1;
return(Index);
}

MaxIndex - 8

MinIndex - 0
элемента массива от минимального до максимального..

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