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

 
Artem Onopin:

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

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

Домашнее задание:

1. Сначала определите тикет который надо удалить из массива.

2. Перебором массива определите индекс соответствующий этому тикету, а не тикету ордера случайно оказавшемуся выбранным перед началом цикла.

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

Индекс найденного тикета может быть равен нулю, а его вы исключаете условием

            if (IndexMass>0)
               {
                  ArrayCopy(MassBuyLock,MassBuyLock,IndexMass,IndexMass+1,ArraySize(MassBuyLock)-IndexMass-1);
// Выделенное не обязательно. Если параметр не задан, то копируется массив от указанного индекса до конца массива
                  ArrayResize(MassBuyLock, ArraySize(MassBuyLock)-1);
               }
 
Alexey Viktorov:

Домашнее задание:

1. Сначала определите тикет который надо удалить из массива.

2. Перебором массива определите индекс соответствующий этому тикету, а не тикету ордера случайно оказавшемуся выбранным перед началом цикла.

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

Индекс найденного тикета может быть равен нулю, а его вы исключаете условием


Хорошо, сейчас займусь домашним заданием, как сделаю отпишусь, проверите))

 

Если порядок тикетов в массиве не важен можете попробовать такой вариант:

for(int i = OrdersTotal()-1; i >= 0; i--)
{
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
   {
      if(MassBuyLock[i] == OrderTicket())
      {
         MassBuyLock[i] = -1;
         break;
      }
   }
}
int arr_size = ArraySize(MassBuyLock);
ArraySort(MassBuyLock, WHOLE_ARRAY, 0, MODE_DESCEND);  
ArrayResize(MassBuyLock, arr_size-1);

добавлено:

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

 
Alexey Viktorov:

Домашнее задание:

1. Сначала определите тикет который надо удалить из массива.

2. Перебором массива определите индекс соответствующий этому тикету, а не тикету ордера случайно оказавшемуся выбранным перед началом цикла.

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

Индекс найденного тикета может быть равен нулю, а его вы исключаете условием


Вот так всё работает

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

Вот так всё работает

            ArrayCopy(MassBuyLock,MassBuyLock,IndexMass,IndexMass+1);

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

 
STARIJ:

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

Из документации

count=WHOLE_ARRAY

[in]  Количество элементов, которые нужно скопировать. По умолчанию копируется весь массив (count=WHOLE_ARRAY).

а точней, до конца массива.

 
Alexey Viktorov:   а точней, до конца массива.
вот это меня и смутило - сколько их там? Если копировать влево - вроде бы уместятся
 
STARIJ:

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


Количество известно элементов их немного, да и периодически обнуляется массив, так что думаю всё будет хорошо)) Спасибо, за подсказки.

 
Artem Onopin:  Количество известно элементов их немного, да и периодически обнуляется массив, так что думаю всё будет хорошо)) Спасибо, за подсказки.

а Туда-Сюда забросил?

 
STARIJ:

а Туда-Сюда забросил?


Откуда такая информация?))