![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение переменной-счетчика в цикле for
__alex © (2006-04-04 12:41:00)Точнее, попытка изменения :) Ибо компилятор этого не разрешает. Вот пример:
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) изменение счетчика не считалось ошибкой!
Так что подскажите плиз, может это безобразие можно как то обойти?
Джо (2006-04-04 14:10:00) [1]Не нужно искать оправданий произвольному изменению счетчика цикла. Это не есть гуд, хоть в Си, хоть в Делфи, хоть в Паскале. В Турбо Паскале, кстати (если я не ошибаюсь), это можно было сделать. Но это не значит, что нужно :)
__alex (2006-04-04 14:08:00) [2]Удалено модератором
Примечание: Обсуждение персоналиев и нападки в другом месте
Ksenom (2006-04-04 13:53:00) [3]__alex, нет, в D5-D2005 тоже нельзя трогать счётчик.
Если пишешь на Сях, то лучше их и оттачивай...
Одно решение, не парится и не переживать... Используй While...
И на последок, код у Си куда менее красив чем у делфей (если смотреть как сторонний наблюдатель).
Германн (2006-04-04 13:48:00) [4]
> Нда, все верно. Но повторюсь, это только один пример цикла!
> Иногда надо перескочить на несколько елементов вперед-назад,
> и че тогда прикажешь делать?
Надо - перескакивай. Но не в цикле for!
И советую остыть. Иначе остудят. :-)
__alex (2006-04-04 13:35:00) [5]
> Virgo_Style © (04.04.06 13:33) [11]
>
> зачем надо решать задачу именно неприспособленным для этого
> инструментом?
Это как понять??
Virgo_Style (2006-04-04 13:33:00) [6]зачем надо решать задачу именно неприспособленным для этого инструментом?
__alex (2006-04-04 13:17:00) [7]Удалено модератором
Примечание: Будешь продолжать свои нападки, будешь только читать и то из далека
Плохиш (2006-04-04 13:11:00) [8]
> Иногда надо перескочить на несколько елементов вперед-назад,
> и че тогда прикажешь делать?
"Консерваторию" менять надо.
Palladin (2006-04-04 13:09:00) [9]
> __alex © (04.04.06 13:05) [6]
переходи на С или Basic, если слишком сложно вдруг станет жить
__alex (2006-04-04 13:07:00) [10]Блин, вот нету у меня щас дельфей седьмых... Все таки вроде там можно было изменять счетчик.... Может проверит кто?
__alex (2006-04-04 13:05:00) [11]Удалено модератором
Примечание: Обсуждение персоналиев и нападки в другом месте
balepa (2006-04-04 12:51:00) [12]
> __alex © (04.04.06 12:41)
В справке по этой ошибке приведен абсолютно бестолковый пример цикла, где изменение счетчика используется вместо вызова break.
Сам ты бестолковый (надо бы другое очень нехорошее слово)
MBo (2006-04-04 12:51:00) [13]Для данной цели используй цикл for ... downto и все дела, да и скорость вырастет
А второй некрасивый цикл можно приукрасить конструкцией
if ... then
Delete
else
Inc
Megabyte (2006-04-04 12:49:00) [14]А чем тебя While не устраивает?
Ega23 (2006-04-04 12:49:00) [15]
for i:=List.Count-1 downto 0 do
EvS (2006-04-04 12:46:00) [16]А чем в данном случае не устраивает ls.Pack