Вопросы по коду. - страница 9

 
gnesnyi #:

Работает, спасибо за подсказку. Правда если просто  крутить в обратную сторону, то вообще ничего не удаляет.

А вот если, зная что объектов не более 10 написать так, то работает:

for(int i=OrdersTotal()+10; i>=0; i--) {                                        

                     if(ObjectGet(ObjectName(i), OBJPROP_COLOR)==clrDodgerBlue) {                    

                        ObjectDelete(0,ObjectName(i)); }}

Хотя кривой вариант какой-то.

А причем здесь OrdersTotal(), когда вы работаете с кол-во графических объектов?

ObjectsTotal

 
gnesnyi #:

Работает, спасибо за подсказку. Правда если просто  крутить в обратную сторону, то вообще ничего не удаляет.

А вот если, зная что объектов не более 10 написать так, то работает:

for(int i=OrdersTotal()+10; i>=0; i--) {                                        

                     if(ObjectGet(ObjectName(i), OBJPROP_COLOR)==clrDodgerBlue) {                    

                        ObjectDelete(0,ObjectName(i)); }}

Хотя кривой вариант какой-то.

а вот если так сделать, то получится программирование методом научного тыка :-)

когда не пытаясь понять логику устройства просто меняются/перебираются опции. Не вышло с плюс значит минус. Если перебор попробовать поделить. Добавить магическую константу. Поменять ObjectsTotal() на OrdersTotal(), вдруг прокатит. И так далее.

Хотя устройство весьма просто:

образно: где-то внутри терминала лежит массив с данными по объектам. ObjectsTotal() возвращает кол-во элементов там. При ObjectDelete элемент из массива удаляется (у всех элементов с большим индексом, этот самый индекс уменьшается). Следующий объект становится на место текущего. 

Поэтому если в инкрементном цикле от 0 вызвать ObjectDelete и не скорректировать следующий запрашиваемый индекс - объекты удаляться через 1. В декрементном такой проблемы нет, потому что элементы со более значащими индексами ты уже посмотрел.

И кстати: если это не просто короткий скрипт, то всеми силами избегайте использования ObjectsTotal() ObjectGetXXX()... лучше сохранить данные про нужные объекты к себе в массивы/структуры и их поддерживать

 
Nikita Chernyshov #:

А причем здесь OrdersTotal(), когда вы работаете с кол-во графических объектов?

ObjectsTotal

Действительно :)
 
Да уж, вот это я написал, так написал. Очередной раз убеждаюсь, что ручками нужно писать, а не копиПастом. Спасибо, буду пробовать.
 

Декрементный тоже удаляет объекты через  один.

for(int i=ObjectsTotal(); i>=0; i--) {                                         

                     if(ObjectGet(ObjectName(i), OBJPROP_COLOR)==clrCrimson) {                    

                        ObjectDelete(0,ObjectName(i)); }}

Не пойму, из-за чего в случае обратного цикла должно работать. Ведь цикл запускается командой  i=ObjectsTotal(), но элементов же стало на один меньше.

Допустим при запуске было 100 элементов. Первая итерация нашла и удалила элемент. При втором запуске элементов уже 99, а циклу предписано сделать шаг  i--.

Вот и получается, что с какой стороны ни посчитай скачем через 2. 

Что, без массива никак значит?

 
gnesnyi #:

Декрементный тоже удаляет объекты через  один.

Так не бывает.
Может код не скомпилировался и осталась предыдущая версия исполняемого файла?
 
gnesnyi #:

Ведь цикл запускается командой  i=ObjectsTotal

Обычно итератор инициализирует значением ObjectsTotal()-1
 
Sergey Gridnev #:
Так не бывает.
Может код не скомпилировался и осталась предыдущая версия исполняемого файла?

Сергей, Вы правы. Заработало.

 

switch (level) {

   case 1:

      if(...) {...}

      if(...) {...}

      break;

   case 2:     

      if(...) {...}

      break

      if(...) {...}

      break;

}


Знающие люди, подскажите пожалуйста, в каком варианте я правильно break поставил? case 1 или case 2? Или можно вообще без break, так как у меня if() используется. 

 
С точки зрения компилятора лишним будет самый нижний break и то что в строке выше.