Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизатор режет лишнее


Страницы:   1 2

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]

Дважды СЗЗБ


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо