powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Требуется субботний ликбез
25 сообщений из 29, страница 1 из 2
Требуется субботний ликбез
    #39522179
Почему иногда вместо
Код: pascal
1.
for i := 0 to X.Count-1 do

нужно использовать
Код: pascal
1.
for i := X.Count-1 downto 0 do

???



В каких именно случаях один из двух вариантов лучше другого?
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522183
sined
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на чинающий,
Когда нужно удалять элементы из х
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522201
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sinedКогда нужно удалять элементы из х

Нет. Когда имеет смысл, не запрашивать постоянно значение из X.Count ... Мы помещаем 1 раз, это значение в переменную I и делаем Dec
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522202
Фотография Bator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sined, если стоит оптимизация и от направления ничего не зависит (к примеру просто счетчик увеличивать), то можно заметить, что проход идет в обратном порядке, т.е. не зависимо от того как написано, отсюда как бы следует (не вдаваясь в причины), что в обратном порядке оптимальнее. но человеку воспринимать удобнее в прямом порядке.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522216
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНет. Когда имеет смысл, не запрашивать постоянно значение из X.Count ... Мы помещаем 1 раз, это значение в переменную I и делаем DecCount запрашивается один раз в любом случае. Вот такой код будет отлично работать
Код: pascal
1.
2.
for i := 0 to X.Count-1 do
  X.Delete(0);

и очистит весь список. А вот такой
Код: pascal
1.
2.
3.
i := 0;
while i <= X.Count do
  X.Delete(0);

удалит только половину списка
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522217
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_А вот такойПоправка. Вот такой
Код: pascal
1.
2.
3.
4.
5.
i := 0;
while i <= X.Count do begin
  X.Delete(0);
  Inc(i);
end;
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522218
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

второй код проверил? Удалит все и вылетит.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522219
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk__Vasilisk_А вот такойПоправка. Вот такой
Код: pascal
1.
2.
3.
4.
5.
i := 0;
while i <= X.Count do begin
  X.Delete(0);
  Inc(i);
end;


Не особо лучше. Смысла в таком коде нет. В while обычно ставят "пока количество больше нуля".
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522220
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Вроде 10 ка сообщений а несёшь дичь какую - то. Ошибься скорее всего по пьяни. Так как логика такова, что надо сверять текущую связку, с I а не один раз.

На сякий случай через отладчик проверь, как работает код (F7)
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522223
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так. Дубль 3. Имелось в виду вот это
Код: pascal
1.
2.
3.
4.
5.
i := 0;
while i <= X.Count - 1 do begin
  X.Delete(i);
  Inc(i);
end;
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522226
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Васик. А ты правда с 2007 года программируешь? А то пишешь непонятно чего...


А теперь поставь memo и напиши в две строки, ровно две без 3, и запусти свой код. Увидишь что 2 строка не удалиться..
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522227
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову, что бы быть не монотонным, вот правильный код

Код: pascal
1.
2.
 while x.Count > 0 do
    x.Delete(0);
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522237
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикУвидишь что 2 строка не удалиться..Правильно
_Vasilisk_А вот такой ... удалит только половину списка
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522238
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Неа, вот правильный:
Код: pascal
1.
2.
 while x.Count > 0 do
    x.Delete(x.Count-1);



Или даже так:
Код: pascal
1.
x.Clear;
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522240
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кхм. Ну всё, началась ахинея. Человек спросил что и для чего, один несёт что в двух случаях count не будет вызван, хотя в таком случае будет

Код: pascal
1.
for i := 0 to X.Count-1 do



При том, ещё от вызванного count будет вызвать dec

...

А этот, уже поддерживает его походу ...

Правильный код в 20800838

А если уж стоит удалить текст, делайте просто text = '';
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522348
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на чинающийПочему иногда вместо
Код: pascal
1.
for i := 0 to X.Count-1 do

нужно использовать
Код: pascal
1.
for i := X.Count-1 downto 0 do

???



В каких именно случаях один из двух вариантов лучше другого?

Опыт, сын ошибок трудных, все расставит на свои места.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522374
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на чинающийПочему иногда вместо
Код: pascal
1.
for i := 0 to X.Count-1 do


нужно использовать
Код: pascal
1.
for i := X.Count-1 downto 0 do


???



В каких именно случаях один из двух вариантов лучше другого?В одном только случае: когда логика задачи такова, что какой-то из этих вариантов лучше другого (а иногда он даже является единственно верным, хотя и не всегда - тоже зависит от логики задачи).
Во всех остальных случаях - без разницы.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522378
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вброс кое-чего на вентилятор...

авторВ каких именно случаях один из двух вариантов лучше другого?
Собсно, ни в каких. Count в обоих этих выражениях вычисляется однократно. Но если требуется удалять элементы из списка, выражение с downto работает корректно, а цикл с to - нет.
В то же время, не следует применять подобные выражения в других языках. К примеру, в Java Count будет вычисляться при каждом проходе цикла, что скажется на производительности программы, а также может вызвать сбои.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522405
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильнее спрашивать - когда имеет значение последовательность прохода, а когда - нет.
Имеет, когда обработка элемента n+1 зависит от обработки элемента n. В этом случае нужно думать над порядком прохождения цикла. Как уже было написано, пример - удаление элементов.
В остальных случаях ни как написано, ни как реально считается (обычно от большего к меньшему, как бы не было написано в коде), значения не имеет и можно об этом специально не задумываться.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522408
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonИмеет, когда обработка элемента n+1 зависит от обработки элемента nНе только.
Навскидку 2 примера:
1. Какой-то кэш-массив, заполнение которого логикой программы предусмотрено сначала. Естественно, что и искать в нем заполненный элементы правильнее и быстрее будет сначала, а не с конца. Хотя с конца тоже можно, но будет дольшн.
2. FIFO обычный. Просто надо 1-й элемент отдать из очереди, хотя остальные от него и не зависят.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522484
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любезный Count в обоих этих выражениях вычисляется однократно.

=_= Ещё один. От куда вы все такие ??? От куда такая уверенность что однократно???

Вы вводе людей в заблуждения. Так как цикл развёртывается в

Код: pascal
1.
2.
if i = X.Count - 1 then
 break;



Следовательно, не один раз.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522493
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

авторЕстественно, что и искать в нем заполненный элементы правильнее и быстрее будет сначала, а не с конца. Хотя с конца тоже можно, но будет дольшн.

Правильнее будет сделать индекс, если уж на то пошло :) А не перебирать тупо кучу строк. Хотя в вырожденных случаях, когда до 80ти процетов случаев попадают на первые строки, может оказаться лучше искать подряд.

авторFIFO обычный

фифо вообще списком делается, а не циклом.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522503
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonА не перебирать тупо кучу строкКто о строках говорил?
И какой нафиг индекс, если у меня массив в 100 хэндлов или нулей, из которых обычно заполнены первые 2-3? Зачем?
И, да, это абстрактный пример был.

По фифо. Список. А по этому списку не циклом ходят? Count в предыдущих примерах - не о списке речь?

Разницы вообще я принципиальной не вижу в данных абстрактных случаях - список, массив - одно и то же.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522506
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonфифо вообще списком делается, а не циклом.А, если имеется ввиду, что всегда берется 1-й элемент списка - то понятно.
Но опять же это пример цикла, идущего сначала
while Count <> 0 do
Proc( Items[ 0 ] );
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522516
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

авторКто о строках говорил?

Строки - как частный случай массива данных. Как будто нельзя массив байт индексировать :)

авторИ какой нафиг индекс, если у меня массив в 100 хэндлов или нулей, из которых обычно заполнены первые 2-3? Зачем?

Откуда я знаю, что у вас там за очень частный случай :) На 2-3 вообще нет смысла цикл использовать. Три вложенных if-then-else скорее всего будут быстрее скорее всего.

Я говорю про общий случай.

авторПо фифо. Список. А по этому списку не циклом ходят?

А зачем там цикл? Связанный список. Что и зачем там перечислять? Две операции - либо добавить в буфер, либо извлечь. Добавили - сделали ссылку на новый элемент на конце старого, выняли - убрали ссылку и элемент из списка. Эмуляцию Count'а еще, если сильно хочется, можно сделать. Проще и сильно быстрее, чем бегать что-то считать.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Требуется субботний ликбез
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]