Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Внизизменение диапазона цикла FOR внутри цикла Найти похожие ветки
← →
хочу все знать (2006-03-11 17:02) [0]всем привет
народ подскажите как обойти проблему
я использую цикл
for n:=0 to listbox1.count-1 do
begin
........
if .... then здесь происходит добавление колличества записей в листбоксе
........
end
в результате чего цикл отрабатывает не все записи а только стока скока их было до добавления в листбокс
как етого избежать и пройти по всем записям
← →
Zeqfreed © (2006-03-11 17:09) [1]Лучше так не делать. Но если приспичит, то можно использовать циклы repeat и while.
← →
API © (2006-03-11 17:09) [2]
i := 0;
while (i < ListBox.Count) do
begin
inc(i)
end;
← →
grisme © (2006-03-11 17:16) [3]однозначно while, т.к. конечное и начальное выражение for рассчитываются один раз, а в while, каждый цикл..:)
← →
grisme © (2006-03-11 17:22) [4]класс..только что проверил:
конструкция
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:27) [5]Еще эксперимнт. Как мы знаем,цикл for - в асме аналог loop(где кон.значение-ecx).Так вот, я просто поменял значение ecx - все работает.
В твоем случае, пихай в ecx(при добавлении элементов) новое значение listbox1.count.
← →
AlexeyT © (2006-03-11 17:31) [6]
> Еще эксперимнт. Как мы знаем,цикл for - в асме аналог loop
Дурацкие эксперименты IMHO. Никто не гарантирует, что это будет работать с разными версиями дельфей и с/без оптимизации. Правильно сказали, надо использовать while.
← →
grisme © (2006-03-11 17:35) [7]К стати, это и не работает...сорри...:)
← →
grisme © (2006-03-11 17:36) [8]пересчет в for все-таки не удасться.:( Но изменение параметра цикла работает.:)
← →
API © (2006-03-11 17:40) [9][4] grisme © (11.03.06 17:22)
Два варианта:
1. Оптимизатор отловит вставку на ассемблере, и будет использовать неоптимальный код для цикла. Для работы с ListBox"ом - заметной разницы не будет. Но в других случаях эта неоптимальность может привести к значительным потерям производительности.
2. Оптимизатор не отловит вставку на ассемблере. Нервотрепка автору ветки и флейм в самой ветке - обеспечены. Опять же - потеря времени.
Ни первый, ни второй вариант проверять не собираюсь по причине изначально "кулхацкерского" подхода к решению задачи, предложенного в [4].
← →
grisme © (2006-03-11 17:41) [10]можешь посмотреть в окне CPU. можно будет делать пересчет если мы в досе(править сегмент кода):)
← →
API © (2006-03-11 17:42) [11][7], [8] - чего и следовало ожидать. Причина - вариант 2.
← →
jack128 © (2006-03-11 21:43) [12]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;
Сколько итераций будет в этом коде??
← →
хочу все знать (2006-03-11 23:49) [13]да предложений масса но я полностью согласен что через
while (i < ListBox.Count) do
будет безопасние
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.047 c