Форум: "Начинающим";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизИзменение переменной-счетчика в цикле 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 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.066 c