Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

Оптимизатор режет лишнее   Найти похожие ветки 

 
SpellCaster   (2007-08-01 18:09) [0]

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

Вот примерчик функции:

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; какое-либо действие - всё ОК.
Что-то я никак не догоню, в чем фикус.


 
Kolan ©   (2007-08-01 18:17) [1]

Дурацкий код. какойто

Вместо
if (s="a") or (s="b") then
begin
Exit;
end;
и:
until False;

Почему бы не написать:


repeat

until (s="a") or (s="b");


Ну и тд&#133


 
SpellCaster   (2007-08-01 18:42) [2]

> [1] Kolan ©   (01.08.07 18:17)

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


 
Плохиш ©   (2007-08-01 18:48) [3]


> SpellCaster   (01.08.07 18:42) [2]
> > [1] Kolan ©   (01.08.07 18:17)
>
> Это пример, просто я сократил его из очень большой процедуры,
>  где куча всяких действий.

В сокращённой версии никаких бесконечных циклов нет, ищи ошибку в 17й строке...


 
Kolan ©   (2007-08-01 18:51) [4]

Зачем вообще беск циклы нужны?


 
SpellCaster   (2007-08-01 19:40) [5]

Кстати, забыл уточнить - у меня Д7.
> [3] Плохиш ©   (01.08.07 18:48)
Какая версия Дельфей? Точно в результирующем коде Exit не убивается? Брейкпоинт на него ставится?

> [4] Kolan ©   (01.08.07 18:51)

Так удобней, если выйти из него надо из двух и более мест или же условие выхода может измениться к тому моменту, когда дело дойдет до until.


 
Kolan ©   (2007-08-02 09:13) [6]

> Так удобней

Бред, ты просто не умеешь пользоваться циклами.
Попробуй GoTo — удачи.


 
icWasya ©   (2007-08-02 09:51) [7]

А кстати

  arr: array [0..2] of real;

и

  for i:=1 to 10 do
     arr[i]:=0.1;


 
Anatoly Podgoretsky ©   (2007-08-02 10:18) [8]

Дважды СЗЗБ


 
SpellCaster   (2007-08-02 10:32) [9]

> [6] Kolan ©   (02.08.07 09:13)
> Бред, ты просто не умеешь пользоваться циклами

Пожалуйста, хватит флуда. Тема совершенно другая.

> [7] icWasya ©   (02.08.07 09:51)

Ну да, в одном месте исправил, в другом забыл. Но это же просто тупой тестовый пример, елки-палки, сколько можно говорить. Смысла в нём никакого. Однако для выявления проблемы он годится вполне.

> [8] Anatoly Podgoretsky ©   (02.08.07 10:18)

Чем пальцевать, лучше бы сказал что-нибудь полезное по теме. Напоминаю, что тема - странное поведение оптимизатора.

Не тратьте свое драгоценное время на анализ кривизны данной функции и выдачу полезных советов касательно парадигмы программирования. Вопрос предельно конкретен. Может ли хоть кто-то объяснить, почему выбрасывается процедура выхода? Или же хотя бы скопировать приведенный код в свой проект и проверить? Неужели сие чересчур сложно?


 
Palladin ©   (2007-08-02 10:50) [10]

Потому что Exit там лишний, он и выкидывается... просто по логике исполнения напишешь ты его или нет, в любом случае произойдет выход из функции...


 
Palladin ©   (2007-08-02 10:52) [11]

хотя нет... глючу... там же until false...


 
Плохиш ©   (2007-08-02 10:58) [12]


> Palladin ©   (02.08.07 10:52) [11]
> хотя нет... глючу... там же until false...

За то, s="a" и Result=false, т.ч. в приведённом бессмысленном примере выход будет всегда, без вариантов...

> SpellCaster   (02.08.07 10:32) [9]


> Но это же просто тупой тестовый пример

Рекомендую поискать не там, где светло, а там, где потерял...


 
JaK[Light] ©   (2007-08-02 10:59) [13]

Подтверждаю Плохиша: все нормально пашет, никаких бесконечных циклов.


 
JaK[Light] ©   (2007-08-02 11:02) [14]

Если грешишь на оптимизатор, то выруби его и попробуй снова.


 
Плохиш ©   (2007-08-02 11:04) [15]


> SpellCaster   (01.08.07 19:40) [5]
> Кстати, забыл уточнить - у меня Д7.
> > [3] Плохиш ©   (01.08.07 18:48)
> Какая версия Дельфей? Точно в результирующем коде Exit не
> убивается? Брейкпоинт на него ставится?

Версия делфи совершенно не при чём, тут всё видно и невооружённым глазом. exit не убивается, а преобразовывается в переход к коду выхода из процедуры. И не понятно, какое отношение возможность постановки точек остановки имеет к бесконечным циклам?


 
JaK[Light] ©   (2007-08-02 11:13) [16]

И если войти в CPU, то можно увидеть, что там процедуры Exit вообще нет.


 
Плохиш ©   (2007-08-02 11:23) [17]


> И если войти в CPU, то можно увидеть, что там процедуры
> Exit вообще нет.

Exit - это псевдопроцедура, которую компилятор заменяет на код уместный в каждом конкретном случае, так же как и write(ln)/read(ln).


 
pasha_golub ©   (2007-08-02 12:02) [18]


> Плохиш ©   (02.08.07 11:23) [17]


> Exit - это псевдопроцедура, которую компилятор заменяет
> на код уместный в каждом конкретном случае, так же как и
> write(ln)/read(ln).

Добавлю.

И даже, если Exit находится внутри try finally, то секция finally выполнится.


 
Kolan ©   (2007-08-02 12:57) [19]

> [8] Anatoly Podgoretsky ©   (02.08.07 10:18)
> Дважды СЗЗБ

А че это значит «СЗЗБ»?


 
Zagaevskiy ©   (2007-08-02 13:19) [20]

Самый Зелёный Злобный Буратино


 
SpellCaster   (2007-08-02 13:32) [21]

> Exit - это псевдопроцедура, которую компилятор заменяет
> на код уместный в каждом конкретном случае, так же как и
> write(ln)/read(ln).

Благодарю, не знал.

> [13] JaK[Light] ©   (02.08.07 10:59)

> Подтверждаю Плохиша: все нормально пашет, никаких бесконечных
> циклов


Ясно, значит, это у меня что-то глючит.

> И не понятно, какое отношение возможность постановки точек
> остановки имеет к бесконечным циклам?

Никакого. Это просто способ проверки, была ли удалена данная строчка. Точно так же можно проверить по наличию синей точки слева.


 
MikeZ   (2007-08-08 23:41) [22]

Это просто глюк Делфы. У меня тоже было, что она пропускала строки кода. Ребилдни. Если не поможет, перегрузи Делфу, ребилдни, напиши что-то выше или ниже этого куска и посмотри.


 
Плохиш ©   (2007-08-08 23:49) [23]


> MikeZ   (08.08.07 23:41) [22]
> Это просто глюк Делфы.

Ну да, а ещё Билл Гейтс виноват... Даже не смешно.


 
shtam   (2007-08-09 13:44) [24]

чтоб отключить оптимизатор напиши перед нужным кодом {$o-}
и {$o+} чтоб оптимизатор включить


 
SpellCaster   (2007-08-15 12:35) [25]

> [23] Плохиш ©   (08.08.07 23:49)
Ну а что, разве Дельфа не может глючить?

Всем спасибо. Правда, проблема так и осталась загадкой.


 
homm ©   (2007-08-15 12:41) [26]

> почему-то Exit (пробовал и Break) выкидывается из финального кода

Что это?


 
homm ©   (2007-08-15 12:42) [27]

> [8] Anatoly Podgoretsky ©   (02.08.07 10:18)
> Дважды СЗЗБ

ССЗБ ?



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

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
1-1186988861
mixvictor
2007-08-13 11:07
2007.10.28
Печать через интернет


1-1185977371
SpellCaster
2007-08-01 18:09
2007.10.28
Оптимизатор режет лишнее


2-1191391798
Андрей Пл
2007-10-03 10:09
2007.10.28
interbase вопрос от начинающего!!!


2-1191411254
два_программера
2007-10-03 15:34
2007.10.28
Структура базы


2-1191334493
alles
2007-10-02 18:14
2007.10.28
Вопрос по TForm