![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
изменение диапазона цикла FOR внутри цикла [D7, XP]
хочу все знать © (2006-03-11 17:02:00)всем привет
народ подскажите как обойти проблему
я использую цикл
for n:=0 to listbox1.count-1 do
begin
........
if .... then здесь происходит добавление колличества записей в листбоксе
........
end
в результате чего цикл отрабатывает не все записи а только стока скока их было до добавления в листбокс
как етого избежать и пройти по всем записям
хочу все знать (2006-03-11 23:49:00) [1]да предложений масса но я полностью согласен что через
while (i < ListBox.Count) do
будет безопасние
jack128 (2006-03-11 21:43:00) [2]grisme © (11.03.06 17:22) [4]
изменить значение счетчика можно и без асма, но тя на каждом шагу будут поджидать неприятные сюрпризы
var
I: Integer;
begin
for I := 0 to 10 do
begin
PInteger(@I)^ := I + 1;
ShowMessage(IntToStr(I));
end;
end;
Сколько итераций будет в этом коде??
API (2006-03-11 17:42:00) [3][7], [8] - чего и следовало ожидать. Причина - вариант 2.
grisme (2006-03-11 17:41:00) [4]можешь посмотреть в окне CPU. можно будет делать пересчет если мы в досе(править сегмент кода):)
API (2006-03-11 17:40:00) [5][4] grisme © (11.03.06 17:22)
Два варианта:
1. Оптимизатор отловит вставку на ассемблере, и будет использовать неоптимальный код для цикла. Для работы с ListBox'ом - заметной разницы не будет. Но в других случаях эта неоптимальность может привести к значительным потерям производительности.
2. Оптимизатор не отловит вставку на ассемблере. Нервотрепка автору ветки и флейм в самой ветке - обеспечены. Опять же - потеря времени.
Ни первый, ни второй вариант проверять не собираюсь по причине изначально "кулхацкерского" подхода к решению задачи, предложенного в [4].
grisme (2006-03-11 17:36:00) [6]пересчет в for все-таки не удасться.:( Но изменение параметра цикла работает.:)
grisme (2006-03-11 17:35:00) [7]К стати, это и не работает...сорри...:)
AlexeyT (2006-03-11 17:31:00) [8]
> Еще эксперимнт. Как мы знаем,цикл for - в асме аналог loop
Дурацкие эксперименты IMHO. Никто не гарантирует, что это будет работать с разными версиями дельфей и с/без оптимизации. Правильно сказали, надо использовать while.
grisme (2006-03-11 17:27:00) [9]Еще эксперимнт. Как мы знаем,цикл for - в асме аналог loop(где кон.значение-ecx).Так вот, я просто поменял значение ecx - все работает.
В твоем случае, пихай в ecx(при добавлении элементов) новое значение listbox1.count.
grisme (2006-03-11 17:22:00) [10]класс..только что проверил:
конструкция
for i:=1 to 15 do
if i=6 then i:=i+1;
отказалась работать, но согласилась работать
вот эта:
for i:=1 to 15 do
begin
if i=6 then
begin
asm
inc i
end;
end;
end;
Причем i дошло не до 15, а до 16!!!8))
grisme (2006-03-11 17:16:00) [11]однозначно while, т.к. конечное и начальное выражение for рассчитываются один раз, а в while, каждый цикл..:)
Zeqfreed (2006-03-11 17:09:00) [12]Лучше так не делать. Но если приспичит, то можно использовать циклы repeat и while.
API (2006-03-11 17:09:00) [13]
i := 0;
while (i < ListBox.Count) do
begin
inc(i)
end;