![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизатор режет лишнее
SpellCaster © (2007-08-01 18:09:00)Столкнулся со странным поведением оптимизатора кода.
Вот примерчик функции:
function stuff: boolean;
var s: string;
arr: array [0..2] of real;
i: Integer;
begin
Result:=False;
s:='a';
repeat
if (s='a') or (s='b') then
begin
if Result then
for i:=1 to 10 do
arr[i]:=0.1;
Exit; // выходим из цикла по-любому
end;
until False;
end;
почему-то Exit (пробовал и Break) выкидывается из финального кода, и соотв. получаем бесконечный цикл. Причем если вставить после until False; какое-либо действие - всё ОК.
Что-то я никак не догоню, в чем фикус.
homm (2007-08-15 12:42:00) [1]> [8] Anatoly Podgoretsky © (02.08.07 10:18)
> Дважды СЗЗБ
ССЗБ ?
homm (2007-08-15 12:41:00) [2]> почему-то Exit (пробовал и Break) выкидывается из финального кода
Что это?
SpellCaster (2007-08-15 12:35:00) [3]> [23] Плохиш © (08.08.07 23:49)
Ну а что, разве Дельфа не может глючить?
Всем спасибо. Правда, проблема так и осталась загадкой.
shtam (2007-08-09 13:44:00) [4]чтоб отключить оптимизатор напиши перед нужным кодом {$o-}
и {$o+} чтоб оптимизатор включить
Плохиш (2007-08-08 23:49:00) [5]
> MikeZ (08.08.07 23:41) [22]
> Это просто глюк Делфы.
Ну да, а ещё Билл Гейтс виноват... Даже не смешно.
MikeZ (2007-08-08 23:41:00) [6]Это просто глюк Делфы. У меня тоже было, что она пропускала строки кода. Ребилдни. Если не поможет, перегрузи Делфу, ребилдни, напиши что-то выше или ниже этого куска и посмотри.
SpellCaster (2007-08-02 13:32:00) [7]> Exit - это псевдопроцедура, которую компилятор заменяет
> на код уместный в каждом конкретном случае, так же как и
> write(ln)/read(ln).
Благодарю, не знал.
> [13] JaK[Light] © (02.08.07 10:59)
> Подтверждаю Плохиша: все нормально пашет, никаких бесконечных
> циклов
Ясно, значит, это у меня что-то глючит.
> И не понятно, какое отношение возможность постановки точек
> остановки имеет к бесконечным циклам?
Никакого. Это просто способ проверки, была ли удалена данная строчка. Точно так же можно проверить по наличию синей точки слева.
Zagaevskiy (2007-08-02 13:19:00) [8]Самый Зелёный Злобный Буратино
Kolan (2007-08-02 12:57:00) [9]> [8] Anatoly Podgoretsky © (02.08.07 10:18)
> Дважды СЗЗБ
А че это значит «СЗЗБ»?
pasha_golub (2007-08-02 12:02:00) [10]
> Плохиш © (02.08.07 11:23) [17]
> Exit - это псевдопроцедура, которую компилятор заменяет
> на код уместный в каждом конкретном случае, так же как и
> write(ln)/read(ln).
Добавлю.
И даже, если Exit находится внутри try finally, то секция finally выполнится.
Плохиш (2007-08-02 11:23:00) [11]
> И если войти в CPU, то можно увидеть, что там процедуры
> Exit вообще нет.
Exit - это псевдопроцедура, которую компилятор заменяет на код уместный в каждом конкретном случае, так же как и write(ln)/read(ln).
JaK[Light] (2007-08-02 11:13:00) [12]И если войти в CPU, то можно увидеть, что там процедуры Exit вообще нет.
Плохиш (2007-08-02 11:04:00) [13]
> SpellCaster (01.08.07 19:40) [5]
> Кстати, забыл уточнить - у меня Д7.
> > [3] Плохиш © (01.08.07 18:48)
> Какая версия Дельфей? Точно в результирующем коде Exit не
> убивается? Брейкпоинт на него ставится?
Версия делфи совершенно не при чём, тут всё видно и невооружённым глазом. exit не убивается, а преобразовывается в переход к коду выхода из процедуры. И не понятно, какое отношение возможность постановки точек остановки имеет к бесконечным циклам?
JaK[Light] (2007-08-02 11:02:00) [14]Если грешишь на оптимизатор, то выруби его и попробуй снова.
JaK[Light] (2007-08-02 10:59:00) [15]Подтверждаю Плохиша: все нормально пашет, никаких бесконечных циклов.
Плохиш (2007-08-02 10:58:00) [16]
> Palladin © (02.08.07 10:52) [11]
> хотя нет... глючу... там же until false...
За то, s='a' и Result=false, т.ч. в приведённом бессмысленном примере выход будет всегда, без вариантов...
> SpellCaster (02.08.07 10:32) [9]
> Но это же просто тупой тестовый пример
Рекомендую поискать не там, где светло, а там, где потерял...
Palladin (2007-08-02 10:52:00) [17]хотя нет... глючу... там же until false...
Palladin (2007-08-02 10:50:00) [18]Потому что Exit там лишний, он и выкидывается... просто по логике исполнения напишешь ты его или нет, в любом случае произойдет выход из функции...
SpellCaster (2007-08-02 10:32:00) [19]> [6] Kolan © (02.08.07 09:13)
> Бред, ты просто не умеешь пользоваться циклами
Пожалуйста, хватит флуда. Тема совершенно другая.
> [7] icWasya © (02.08.07 09:51)
Ну да, в одном месте исправил, в другом забыл. Но это же просто тупой тестовый пример, елки-палки, сколько можно говорить. Смысла в нём никакого. Однако для выявления проблемы он годится вполне.
> [8] Anatoly Podgoretsky © (02.08.07 10:18)
Чем пальцевать, лучше бы сказал что-нибудь полезное по теме. Напоминаю, что тема - странное поведение оптимизатора.
Не тратьте свое драгоценное время на анализ кривизны данной функции и выдачу полезных советов касательно парадигмы программирования. Вопрос предельно конкретен. Может ли хоть кто-то объяснить, почему выбрасывается процедура выхода? Или же хотя бы скопировать приведенный код в свой проект и проверить? Неужели сие чересчур сложно?
Anatoly Podgoretsky (2007-08-02 10:18:00) [20]Дважды СЗЗБ