Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1143707729
Yegorchic
2006-03-30 12:35
2006.04.16
Проверить, можно ли из string сделать float


2-1143131539
anton773
2006-03-23 19:32
2006.04.16
загрузить сообщение


15-1143178950
Некто
2006-03-24 08:42
2006.04.16
Одна таблица или две?


2-1143886115
Raul
2006-04-01 14:08
2006.04.16
Как сделать индекс у объекта TImage переменной??


15-1143186521
Ega23
2006-03-24 10:48
2006.04.16
С Днём рождения! 24 марта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский