Одномерный массив, уменьшение на одну ячейку.

 
Здравствуйте! Как добавлять в массив значение понял, а вот как из массива удалить ячейку с ненужным значением понять не могу, справку прочитал все функции с массивами, но ответа так и не нашёл. Массив у меня одномерный, там хранятся тикеты ордеров, когда перекидываю из одного массива в другой тикет ордера, то из которого перекинул массива, надо удалить значение и уменьшить его на 1 ячейку.
 
Artem Onopin:
Здравствуйте! Как добавлять в массив значение понял, а вот как из массива удалить ячейку с ненужным значением понять не могу, справку прочитал все функции с массивами, но ответа так и не нашёл. Массив у меня одномерный, там хранятся тикеты ордеров, когда перекидываю из одного массива в другой тикет ордера, то из которого перекинул массива, надо удалить значение и уменьшить его на 1 ячейку.

Копирование массива "сам в себя"

int  ArrayCopy(
   void&        dst_array[],         // куда копируем
   const void&  src_array[],         // откуда копируем
   int          dst_start=0,         // с какого индекса пишем в приемник // На место ненужного тикета
   int          src_start=0,         // с какого индекса копируем из источника // Со следующего индекса
   int          count=WHOLE_ARRAY    // сколько элементов // Можно пропустить
   );

Затем назначить новый размер массива, на 1 меньше, в результате чего последний индекс будет удалён...

ArrayCopy - Операции с массивами - Справочник MQL4
ArrayCopy - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayCopy - Операции с массивами - Справочник MQL4
 
Artem Onopin:
Здравствуйте! Как добавлять в массив значение понял, а вот как из массива удалить ячейку с ненужным значением понять не могу, справку прочитал все функции с массивами, но ответа так и не нашёл. Массив у меня одномерный, там хранятся тикеты ордеров, когда перекидываю из одного массива в другой тикет ордера, то из которого перекинул массива, надо удалить значение и уменьшить его на 1 ячейку.
Удалить надо значение, находящееся в общем случае где-то в середине массива? Например 1  2  3  9  4  5  6  -  надо удалить элемент с номером 3 (четвертый с начала). Для этого начиная с номера удаляемого элемента копируем в цикле в каждый элемент значение элемента, стоящего справа. Получаем  1  2  3  4  5  6  6. Теперь удаляем последний элемент уменьшением размерности на 1. Получаем  1  2  3  4  5  6
 
STARIJ:
Удалить надо значение, находящееся в общем случае где-то в середине массива? Например 1  2  3  9  4  5  6  -  надо удалить элемент с номером 3 (четвертый с начала). Для этого начиная с номера удаляемого элемента копируем в цикле в каждый элемент значение элемента, стоящего справа. Получаем  1  2  3  4  5  6  6. Теперь удаляем последний элемент уменьшением размерности на 1. Получаем  1  2  3  4  5  6

Именно этот цикл заменяется копированием массива "сам в себя".

 
Artem Onopin:
Здравствуйте! Как добавлять в массив значение понял, а вот как из массива удалить ячейку с ненужным значением понять не могу, справку прочитал все функции с массивами, но ответа так и не нашёл. Массив у меня одномерный, там хранятся тикеты ордеров, когда перекидываю из одного массива в другой тикет ордера, то из которого перекинул массива, надо удалить значение и уменьшить его на 1 ячейку.
Добрый день, Артем.

ваша проблема решена или есть сомнения по поводу сказанного?

с уважением.

P.S. есть и другой вариант, более простой.

 
Alexey Viktorov:

Именно этот цикл заменяется копированием массива "сам в себя".

Согласен. Надо указать в dst_start номер удаляемого элемента. Тогда все последующие скопируются со сдвигом влево

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

//+-------------------------------------------------------+
//| Уменьшить массив                             PROBA.mq4|
//+-------------------------------------------------------+
#property   strict

int Массив[7]={1,2,3,9,4,5,6};  // Массив для удаления одного элемента
int Удали=3;    // Номер удаляемого элемента
void OnStart()
{
  Вывод();
//  for(int Счет=Удали; Счет<ArraySize(Массив)-1; Счет++)
//  Массив[Счет]=Массив[Счет+1];
  ArrayCopy(Массив,Массив,Удали,Удали+1,ArraySize(Массив)-Удали-1);
  Вывод();
  ArrayResize(Массив, ArraySize(Массив)-1);
  Вывод();
}

void Вывод()  // Функция вывода массива для пояснения происходящего
{
  string Строка="";
  for(int Счет=0; Счет<ArraySize(Массив); Счет++)
  Строка+="  "+(string) Массив[Счет];
  Alert(Строка);
}
 
Andrey Kisselyov:
Добрый день, Артем.

ваша проблема решена или есть сомнения по поводу сказанного?

с уважением.

P.S. есть и другой вариант, более простой.


Сомнения есть)) Если можете подсказать более простое решение, то я был бы рад его увидеть.

 
Artem Onopin:

Сомнения есть)) Если можете подсказать более простое решение, то я был бы рад его увидеть.

double massiv[];
ArrayResize(massiv,25);
for(int q=0;q<ArraySize(massiv);q++)massiv[q]=q+1;

//допустим нам нужно удалить 19 элемент

int x=19;                           //индекс удаляемого элемента
int size=ArraySize(massiv)-1;       

//это все что нужно сделать

massiv[x]=massiv[size];             //переносим элемент
ArrayResize(massiv,size);           //сокращаем массив
с уважением.

P.S. это решение в рамках поставленной вами задачи.
 
Остроумно! Последний элемент на место удаляемого и обрезать хвост. Ну это если порядок безразличен
 
STARIJ:
Остроумно! Последний элемент на место удаляемого и обрезать хвост. Ну это если порядок безразличен
почитайте первый пост, речь идет о тикетах, порядок не имеет значение.


с уважением.

 
Andrey Kisselyov:
почитайте первый пост, речь идет о тикетах, порядок не имеет значение.


с уважением.


Как же не имеет? Вы слышали о fifo ? И про американские правила...

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