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

 
Taras Slobodyanik:

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

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

 
Artem Onopin:

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

так в моем примере только 2 строки и нужны - остальное для объяснения
  ArrayCopy(Массив,Массив,Удали,Удали+1,ArraySize(Массив)-Удали-1);
  ArrayResize(Массив, ArraySize(Массив)-1);

строка1: в массив, начиная с точки удаления, копируются следующие далее элементы    строка2: уменьшение размера массива

   снизу вверх

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

 
STARIJ:
так в моем примере только 2 строки и нужны - остальное для объяснения

строка1: в массив, начиная с точки удаления, копируются следующие далее элементы    строка2: уменьшение размера массива

   снизу вверх

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

Вот так всегда... надо было получать свидетельство интеллектуальной собственности... :))))

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

В общем не всё однозначно.

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

P.S. это решение в рамках поставленной вами задачи.

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

Вот, как я применил ваш код:

int SizeLock12=ArraySize(MassBuyLock); // Ищем в массиве тикет ордера
            for(int s=0; s<SizeLock12; s++)
               {
                  if(MassBuyLock[s]==OrderTicket()) // Нашли тикет ордера в массиве
                     {
                        int size=ArraySize(MassBuyLock)-1; // Удаляем ячейку из массива вместе с тикетом
                        MassBuyLock[s]=MassBuyLock[size];
                        ArrayResize(MassBuyLock,size);
                     }
               }
 
Maxim Kuznetsov:
взгляните на вещи по другому. У вас есть список тикетов А и список тикетов Б - иногда надо переносить тикеты между списками. Даже в "стандартной библиотеке" есть средства для работы с такими структурами. То есть у вас не массивы - у вас простые списки/коллекции.

Спасибо, за совет, но перечитывая ваше сообщение, я так и не понял, как нужно взглянуть на вещи по другому? Я понимаю, что мои массивы похожи на списки но, что дальше не понимаю, я в программировании ещё зелёный, если можно по подробней, что вы хотели до меня донести (можно просто ссылки на учебник или документацию, статьи). Заранее, благодарен.

 
STARIJ:
так в моем примере только 2 строки и нужны - остальное для объяснения

строка1: в массив, начиная с точки удаления, копируются следующие далее элементы    строка2: уменьшение размера массива

   снизу вверх

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


Ваш способ я тоже попробовал, но как и постом выше писал, тестер выдаёт ошибку выход за пределы массива

Вот код:

int SizeLock12=ArraySize(MassBuyLock); // Ищем в массиве тикет ордера
            for(int s=0; s<SizeLock12; s++)
               {
                  if(MassBuyLock[s]==OrderTicket()) // Нашли тикет ордера в массиве
                     {                                                                  // Удаляем ячейку из массива вместе с тикетом
                        ArrayCopy(MassBuyLock,MassBuyLock,MassBuyLock[s],MassBuyLock[s]+1,ArraySize(MassBuyLock)-MassBuyLock[s]-1);
                        ArrayResize(MassBuyLock, ArraySize(MassBuyLock)-1);
                     }
               }
 
Artem Onopin:

Ваш способ я тоже попробовал, но как и постом выше писал, тестер выдаёт ошибку выход за пределы массива

Вот код:

Копирование массива не должно быть в цикле. И тем более в таком цикле не следует уменьшать размерность массива.

 
Alexey Viktorov:

Копирование массива не должно быть в цикле. И тем более в таком цикле не следует уменьшать размерность массива.


Так тоже не работает, пишет туже ошибку

int SizeLock12=ArraySize(MassBuyLock); 
            int IndexMass=0;
            for(int s=0; s<SizeLock12; s++)
               { 
                  if(MassBuyLock[s]==OrderTicket())
                     {
                        IndexMass = MassBuyLock[s];
                     }
               }
            if (IndexMass>0)
               {
                  int size=ArraySize(MassBuyLock)-1;
                  MassBuyLock[IndexMass]=MassBuyLock[size];
                  ArrayResize(MassBuyLock,size);
               }

Второй вариант ошибок не выдает, но ничего не происходит

int SizeLock12=ArraySize(MassBuyLock); 
            int IndexMass=0;
            for(int s=0; s<SizeLock12; s++)
               { 
                  if(MassBuyLock[s]==OrderTicket())
                     {
                        IndexMass = MassBuyLock[s];
                     }
               }
            if (IndexMass>0)
               {
                  ArrayCopy(MassBuyLock,MassBuyLock,IndexMass,IndexMass+1,ArraySize(MassBuyLock)-IndexMass-1);
                  ArrayResize(MassBuyLock, ArraySize(MassBuyLock)-1);
               }