Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиПоискОблакоComboВсе проекты

Delphi 11: почему тупит цикл? (внутри)

vovach777 Мудрец (13235), закрыт 12 лет назад
Дополнен 12 лет назад
for i := LOW(i) to HIGH(i) do
begin
//somecode
end;

all.dpr(27) Hint: H2135 FOR or WHILE loop executes zero times - deleted
Дополнен 12 лет назад
i : LongWord;
Дополнен 12 лет назад
--- zero_times.dpr ---
var
i,x : longword;
begin
x := 0;
for i := low(i) to high(i) do
begin
inc(x);
end;

WriteLn(x);
end.
Лучший ответ
Сергей Барановский Мудрец (13989) 12 лет назад
Весь фокус в том, что тип LongWord - это беззнаковое 32 битное число, а в качестве начального и конечного значения в цикле используются выражения, которые в Delphi возвращают 32 битное знаковое число, и таким образом указанный в вопросе цикл эквивалентен циклу
for i := 0 to -1 do
со всеми вытекающими отсюда последствиями.
Остальные ответы
Alexsey Vahtin Профи (931) 12 лет назад
А в цикле ничего не происходит? Тогда это называется мертвый код и он удаляется оптимизатором. Отключите оптимизатор в настройках.
vovach777Мудрец (13235) 12 лет назад

var
i,x : longword;
begin
x := 0;
for i := low(i) to high(i) do
begin
inc(x);
end;

WriteLn(x);
end.

CodeGear Delphi for Win32 compiler version 18.5
Copyright (c) 1983,2007 CodeGear

zero_times.dpr(5) Hint: H2135 FOR or WHILE loop executes zero times - deleted

zero_times.dpr(2) Hint: H2164 Variable 'i' is declared but never used in 'PROGRAM'

zero_times.dpr(11)
12 lines, 0.17 seconds, 12684 bytes code, 12164 bytes data.
Alexsey Vahtin Профи (931) inc(x) вряд ли поможет. Современные оптимизаторы сразу определяют, что здесь достаточно x увеличить на нужное количество и исключают цикл из кода. Вот ежели в цикл поместить WriteLn(x). Все же попробуй отключить оптимизатор. Для этого нужно вызвать окно Project Options с помощью меню Project\Options... На закладке Compiler найди Optimization и убери с него галочку.
Похожие вопросы