Вниз
Скачать: CL | DM;

Изменение переменной-счетчика в цикле for   Найти похожие ветки 

← →
__alex ©   (2006-04-04 12:41) [0]

Точнее, попытка изменения :)  Ибо компилятор этого не разрешает. Вот пример:
var
 ls: TList;
// ...
// инициализируем и заполняем список ls
// ...
for i := 0 to ls.Count-1 do
 if ls[i]=nil then begin
   ls.Delete(i);
   // в этом случае не надо увеличивать i,
   // т.к. в противном случае мы проскочим элемент списка
   dec(i); // ну или i:=i-1
 end;
 // переходим к следующему элементу

Как вы видите, вполне обычная ситуация. Могу привести еще несколько, где надо изменять значения счетчика в цикле принудительно. Но! Дельфи на такую конструкцию ругается:
Assignment to FOR-Loop variable "%s" (E2081)
В справке по этой ошибке приведен абсолютно бестолковый пример цикла, где изменение счетчика используется вместо вызова break. Другого обоснования этого ущемления прав разработчики дельфей видать не придумали.
Поэтому приходится заменять красивый цикл for...do например на это:
var
 ls: TList;
// ...
// инициализируем и заполняем список ls
// ...
i:=0;
while i<ls.Count do begin
 if ls[i]=nil then begin
   ls.Delete(i);
   // в этом случае не надо увеличивать i,
   // т.к. в противном случае мы проскочим элемент списка
   continue;
 end;
 inc(i); // переходим к следующему элементу
end;

Я понимаю, это не великая проблема, но после циклов for в си меня от такого просто корежит. Да и терзают меня смутные подозрения что в старых версиях дельфи (а пример приведен для D2006) изменение счетчика не считалось ошибкой!
Так что подскажите плиз, может это безобразие можно как то обойти?


← →
EvS ©   (2006-04-04 12:46) [1]

А чем в данном случае не устраивает ls.Pack


← →
Megabyte ©   (2006-04-04 12:49) [2]

А чем тебя While не устраивает?


← →
Ega23 ©   (2006-04-04 12:49) [3]

for i:=List.Count-1 downto 0 do


← →
balepa ©   (2006-04-04 12:51) [4]


> __alex ©   (04.04.06 12:41)  
В справке по этой ошибке приведен абсолютно бестолковый пример цикла, где изменение счетчика используется вместо вызова break.

Сам ты бестолковый (надо бы другое очень нехорошее слово)


← →
MBo ©   (2006-04-04 12:51) [5]

Для данной цели используй цикл for ... downto и все дела, да и скорость вырастет

А второй некрасивый цикл можно приукрасить конструкцией
if ... then
 Delete
else
  Inc


← →
__alex ©   (2006-04-04 13:05) [6]

Удалено модератором
Примечание: Обсуждение персоналиев и нападки в другом месте


← →
__alex ©   (2006-04-04 13:07) [7]

Блин, вот нету у меня щас дельфей седьмых... Все таки вроде там можно было изменять счетчик.... Может проверит кто?


← →
Palladin ©   (2006-04-04 13:09) [8]


> __alex ©   (04.04.06 13:05) [6]


переходи на С или Basic, если слишком сложно вдруг станет жить


← →
Плохиш ©   (2006-04-04 13:11) [9]


> Иногда надо перескочить на несколько елементов вперед-назад,
>  и че тогда прикажешь делать?

"Консерваторию" менять надо.


← →
__alex ©   (2006-04-04 13:17) [10]

Удалено модератором
Примечание: Будешь продолжать свои нападки, будешь только читать и то из далека


← →
Virgo_Style ©   (2006-04-04 13:33) [11]

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


← →
__alex ©   (2006-04-04 13:35) [12]


> Virgo_Style ©   (04.04.06 13:33) [11]
>
> зачем надо решать задачу именно неприспособленным для этого
> инструментом?

Это как понять??


← →
Германн ©   (2006-04-04 13:48) [13]


> Нда, все верно. Но повторюсь, это только один пример цикла!
>  Иногда надо перескочить на несколько елементов вперед-назад,
>  и че тогда прикажешь делать?


Надо - перескакивай. Но не в цикле for!
И советую остыть. Иначе остудят. :-)


← →
Ksenom ©   (2006-04-04 13:53) [14]

__alex, нет, в D5-D2005 тоже нельзя трогать счётчик.
Если пишешь на Сях, то лучше их и оттачивай...

Одно решение, не парится и не переживать... Используй While...
И на последок, код у Си куда менее красив чем у делфей (если смотреть как сторонний наблюдатель).


← →
__alex ©   (2006-04-04 14:08) [15]

Удалено модератором
Примечание: Обсуждение персоналиев и нападки в другом месте


← →
Джо ©   (2006-04-04 14:10) [16]

Не нужно искать оправданий произвольному изменению счетчика цикла. Это не есть гуд, хоть в Си, хоть в Делфи, хоть в Паскале. В Турбо Паскале, кстати (если я не ошибаюсь), это можно было сделать. Но это не значит, что нужно :)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.065 c
2-1143618643
Erik1
2006-03-29 11:50
2006.04.16
Освобождение строк.


15-1143620105
balepa
2006-03-29 12:15
2006.04.16
Нормально ли?


2-1144048007
Mozaika_81
2006-04-03 11:06
2006.04.16
Как работать с адресом?


15-1143032206
sBeysenov
2006-03-22 15:56
2006.04.16
Неполная версия Delphi


3-1140436744
PSZ
2006-02-20 14:59
2006.04.16
Сделать мониторинг таблицы, с которой работает другое приложение




   Наверх