powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Требуется субботний ликбез
29 сообщений из 29, показаны все 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
Требуется субботний ликбез
    #39522526
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonЯ говорю про общий случай.Ну вот, общий случай. Массив, в котором данные только вначале (в конце только незаполненные элементы). В этом случае есть 2 варианта:
1) идти сначала и проверять, если не заполненный - то break;
2) идти с конца, проверяя на заполненность.
Как лучше и быстрее? Очевидно. И элементы не зависят друг от друга.

Опять по фифо. Есть очередь по такой схеме. Поток спит и ждет добавления элементов, при добавлении просыпается и обрабатывает все добавленные (их может добавиться много во время обработки первого).
И как это сделать без цикла? Впрочем мне все равно, я делаю это циклом while count <> 0.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522596
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обсуждение сферического коня в вакууме. Для "как удобнее/правильнее" - всегда нужно исходить из задачи.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522622
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЛюбезный Count в обоих этих выражениях вычисляется однократно.

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

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

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



Следовательно, не один раз.

Открой уже View|Debug Windows|CPU и посмотри сам, сколько раз вычисляется.
...
Рейтинг: 0 / 0
Требуется субботний ликбез
    #39522828
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик=_= Ещё один. От куда вы все такие ??? От куда такая уверенность что однократно???
Для тех, кто на бронепоезде
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
{$APPTYPE CONSOLE}
program Test;

uses
  System.Classes;

type
  TMyList = class(TStringList)
  protected
    function GetCount: Integer; override;
  end;
  
{ TMyList }

function TMyList.GetCount: Integer;
begin
  Result := inherited GetCount;
  Writeln('Call GetCount. Result: ', Result);
end;

var
  LList: TStrings;
  Li: Integer;
begin
  LList := TMyList.Create;
  try
    for Li := 0 to 4 do
      LList.Add('AAA');
    Writeln('Forward loop');
    for Li := 0 to LList.Count - 1 do begin
      Writeln(Li);
      LList.Delete(0);
    end;
    Writeln('End loop');
    Writeln('After loop count: ', LList.Count);
    Writeln;

    for Li := 0 to 4 do
      LList.Add('AAA');
    Writeln('Backward loop');
    for Li := LList.Count - 1 downto 0 do begin
      Writeln(Li);
      LList.Delete(Li);
    end;
    Writeln('End loop');
    Writeln('After loop count: ', LList.Count);
  finally
    LList.Free;
  end;
end.

выхлопForward loop
Call GetCount. Result: 5
0
1
2
3
4
End loop
Call GetCount. Result: 0
After loop count: 0

Backward loop
Call GetCount. Result: 5
4
3
2
1
0
End loop
Call GetCount. Result: 0
After loop count: 0
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Требуется субботний ликбез
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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