FOR I=1 TO N STEP 2 не работает =(

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

B4rr4cuda писал(а):Вилкой

Особенно когда подали суп... :)
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

B4rr4cuda писал(а):Вилкой =)

+1

SAK писал(а):А что мешает умножить переменную цикла на требуемый шаг?

то что пришлось бы высчитывать эту самую N, а у меня N это размер виджета.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Vadim писал(а):Особенно когда подали суп...

Суп я ложкой чифаню.
Но вилка используется чаще... :D
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

B4rr4cuda
А я чаще пользуюсь ложкой. Видать до интеллегентности мне как пешком до луны. :)
А если говорить о циклах, то мне попадаются чаще циклы, где одно выполнение тела цикла есть обязательно, поэтому Until .. Repeat пользуюсь чаще, потому как букавок, по сравнению с While меньше. :)
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Vadim
Ясно. Благодарю за ответ. :)
ЗЫ: А насчет ложки, уж не армейская ли привычка? :wink:
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

B4rr4cuda писал(а):А насчет ложки, уж не армейская ли привычка?

А Эркюль Пуаро - не Ваше второе имя? :)
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Неужто угадал? :D Нет, не Пуаро. А вот Шерлоком в детстве зачитывался. :)
Alek_Aaz
новенький
Сообщения: 40
Зарегистрирован: 26.11.2007 03:13:06

Сообщение Alek_Aaz »

Ну вообще то, я тоже чаще пользую ложку ( у меня правда не армейская а скорее всего студенческая привычка :) ) и repeat (по тому что логику While как-то не асиливал :) )
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Attid писал(а):
SAK писал(а):А что мешает умножить переменную цикла на требуемый шаг?

то что пришлось бы высчитывать эту самую N, а у меня N это размер виджета.


В конструкции FOR I=1 TO N STEP 2 разве не нужно N высчитывать?

Хотя вопрос интересен. Что оптимальние: в цикле типа while, repeat until делать i := i+step,
или в цикле типа for ... to ... do делать i*step? Умножение все таки дороже.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

GAMER писал(а):Хотя вопрос интересен.

проверить можно за 15 минут.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

быстрее ^_^ В цикле For i := 1 To 10 i := i * 3 делать нелья ^_^
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Brainenjii писал(а):В цикле For i := 1 To 10 i := i * 3 делать нелья ^_^

Так никто и не принуждает так делать.
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Если шаг кратен степени двойки, то умножение быстрее. Поскольку это поразрядный сдвиг. Но такая проблема существовала при восьми-шестнадцатиразрядных процессорах.

Сейчас, в любом случае, для int64 все указанные операции выполняются одновременно, поскольку выполняются сопроцессором.

Проблема в другом. For быстрее потому, что устроен иначе: При первом проходе вычисляется количество повторений и устанавливается внутренний счетчик. Затем он просто декрементируется. Для while условие вычисляется каждый раз.
Именно по этому в "каноническом" Паскале нельзя изменять внутри цикла счетчик и вершину.

FPC может быть и разрешает, но тогда он делает простой переход по условию, а не проверку на ноль. Т.е. - тот же while
emerald
незнакомец
Сообщения: 8
Зарегистрирован: 28.07.2008 01:14:50

Сообщение emerald »

Timid писал(а):For быстрее потому, что устроен иначе: При первом проходе вычисляется количество повторений и устанавливается внутренний счетчик. Затем он просто декрементируется. Для while условие вычисляется каждый раз.
Именно по этому в "каноническом" Паскале нельзя изменять внутри цикла счетчик и вершину.

Поскольку For работает не по "каноническому" принципу уже довольно давно, вопрос отпадает сам собой что использовать For с корректеровкий счетчика или While. А вот использвание Until как мне кажеться не совсем уместно потому как у него несколько иная логика поведения, поскольку тело циклы выполняется в любом случае. А вот если посматреть на аналог из Си то там если значение счетчика выполняет граничные условия то в тело не попадем, но это как говоритсо ИМХО
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Поскольку For работает не по "каноническому" принципу уже довольно давно

Уверен, а почему тогда компиляция после оптимизации "простого" цикла выглядит как счетчик плюс условный и безусловный переход. По крайней мере в Delphi. Хотя ведь и Сишный while транслируется также...
Ответить