Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Цикл for.   Найти похожие ветки 

 
oooop   (2006-11-08 11:04) [0]

Здраствуйте. Предположим, есть такой цикл:

for i := 0 to MyFuncCount(MyData) do
...


Как в таком случае будут вызываться MyFuncCount? При каждой итерации цикла будут снова запрошена функция MyFuncCount или её значение сохраняется в течении всего цикла?

Спасибо!


 
DrPass ©   (2006-11-08 11:07) [1]

Будет запрашиваться при каждой итерации. Компилятор же не знает, возвращает функция каждый раз одно и то же значение, либо ее результат зависит от фазы Луны


 
Сергей М. ©   (2006-11-08 11:07) [2]


> её значение сохраняется в течении всего цикла?


Да.
Вычисляется единожды.


 
Сергей М. ©   (2006-11-08 11:09) [3]


> DrPass ©   (08.11.06 11:07) [1]


Ты не прав.

В соответствии с правилами Паскаля граничные условия for-цикла вычисляются единожды.


 
Desdechado ©   (2006-11-08 11:10) [4]

Один раз - в паскале/дельфи.
На каждой итерации - в Си.
В этом их существенная и неочевидная разница.


 
ЮЮ ©   (2006-11-08 11:14) [5]


> Будет запрашиваться при каждой итерации.

Основываясь на таком заблуждении и пишут типа
 for i := 0 to List.Count - 1 do begin
   // а внутри цикла беззастенчиво убивают элементы списка и удивляются откуда ошибки
 end;


 
oooop   (2006-11-08 11:15) [6]

Сейчас читал "Написание оптимального кода под Delphi", и встретил там такое предложение:

> Выносите инвариантный код за тело цикла. Наиболее частая
> ошибка – for i:=1 to length(str) do... Дело в том, что при
> каждой итерации будет вызываться функция length, что пагубно
> скажется на производительности. Рекомендуется длину строки
> заранее присвоить переменной. Также не включайте в тело
> цикла код, заведомо не зависящий от изменения итерационной
> переменной.


В этом случае, что Length -- исключение из правил? или это ошибка в статье?


 
DrPass ©   (2006-11-08 11:21) [7]

Вот сейчас посмотрел генерируемый ассемблерный код - действительно, обычные функции вычисляются один раз перед началом цикла. А вот compilermagic-функции типа Length, как ни странно, вычисляются на каждой итерации. Какая-то сермяжная правда в этом есть - они по сути традиционными функциями не являются, а инлайнятся прямо в код. Но архитектура получается уродливой и с "подводными камнями"...


 
DrPass ©   (2006-11-08 11:22) [8]


> ЮЮ ©   (08.11.06 11:14) [5]

А я всегда делаю for i := List.Count - 1 downto 0, и поэтому такая проблема передо мной даже не стояла :)


 
han_malign ©   (2006-11-08 11:23) [9]


> или это ошибка в статье?

- по этой статье уже было бурное обсуждение - это там не единственная, скажем так, неточность(пример выбран неудачно)...


 
DrPass ©   (2006-11-08 11:25) [10]


> han_malign ©   (08.11.06 11:23) [9]

Это не ошибка. Сделай такой цикл и посмотри сгенерированный код. Так и есть - длина строки проверяется на каждой итерации.


 
Desdechado ©   (2006-11-08 11:31) [11]

> длина строки проверяется на каждой итерации
ну, обращение в к -4 байту в строке - это не вызов функции...


 
Плохиш ©   (2006-11-08 12:02) [12]


> DrPass ©   (08.11.06 11:25) [10]
>
> > han_malign ©   (08.11.06 11:23) [9]
>
> Это не ошибка. Сделай такой цикл и посмотри сгенерированный
> код. Так и есть - длина строки проверяется на каждой итерации.

Специально проверил. Врёте, товагищ! По шагам в CPU-окне пройдись и удивись.


 
DrPass ©   (2006-11-08 12:16) [13]


> Плохиш ©   (08.11.06 12:02) [12

Ладно, убедил - когда я первый раз экспериментировал, у меня в функцию Length поставлялась константа :)


 
Anatoly Podgoretsky ©   (2006-11-08 12:50) [14]

> DrPass  (08.11.2006 11:07:01)  [1]

В Паскале цикл FOR а не WHILE
Поэтому цикл будет выполнен один раз


 
Anatoly Podgoretsky ©   (2006-11-08 12:51) [15]

> Desdechado  (08.11.2006 11:10:04)  [4]

> На каждой итерации - в Си.

В СИ цикл WHILE с названием FOR


 
Anatoly Podgoretsky ©   (2006-11-08 12:52) [16]

> oooop  (08.11.2006 11:15:06)  [6]

Мы эту статью здесь не раз читали и каждый раз смеялись и жалели автора.


 
Anatoly Podgoretsky ©   (2006-11-08 12:52) [17]

> DrPass  (08.11.2006 11:21:07)  [7]

Не надо смотреть код, смотреть надо или стандарт языка или справку.


 
Anatoly Podgoretsky ©   (2006-11-08 12:53) [18]

> DrPass  (08.11.2006 11:22:08)  [8]

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


 
Anatoly Podgoretsky ©   (2006-11-08 12:55) [19]

> DrPass  (08.11.2006 11:25:10)  [10]

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


 
DrPass ©   (2006-11-08 13:13) [20]


> Anatoly Podgoretsky ©   (08.11.06 12:55) [19]

Да я уже разобрался... Бывает...


 
Anatoly Podgoretsky ©   (2006-11-08 14:22) [21]

> DrPass  (08.11.2006 13:13:20)  [20]

Бывает, особенно если подобные статьи попадутся. А ведь они такие гадские, намертво в голову внедряется, и если попадется невменяемый программист, то он так и уйдет убежденный в этом, хорошо если еще без ругани, мол ламеры вы все, или с реадонли, в особых случаях.
Тут последнее время много таких встречалось, а прикидывались приличными людьми.


 
SlymRO   (2006-11-09 04:59) [22]

Anatoly Podgoretsky ©   (08.11.06 14:22) [21]
Дядя Толя, рекомендую сменить домен на www.delphimaster.ro


 
Anatoly Podgoretsky ©   (2006-11-09 07:45) [23]

> SlymRO  (09.11.2006 4:59:22)  [22]

У меня и так ro, а не rw



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.042 c
15-1162911360
oldman
2006-11-07 17:56
2006.11.26
Ну вот не поздравляют меня с праздником...


15-1162993960
@!!!ex
2006-11-08 16:52
2006.11.26
Read Only. :((


15-1162970107
Некто_
2006-11-08 10:15
2006.11.26
Нужна простенькая программка для работы с *.dbf


5-1144138249
ru_efim
2006-04-04 12:10
2006.11.26
Разр-тка TDigitEdit = class(TCustomEdit), как побороть сво-воText


4-1152879465
Acidlex
2006-07-14 16:17
2006.11.26
Эмуляция нажатия клавиш в чужом окне





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский