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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.039 c
2-1191685220
hinst
2007-10-06 19:40
2007.10.28
DDE


4-1177402203
Malik
2007-04-24 12:10
2007.10.28
ChekedBox


11-1175206803
nester
2007-03-30 02:20
2007.10.28
БагРепорт: RegKeyGetValueNames съедает последнюю букву


8-1168554278
Infinityx93
2007-01-12 01:24
2007.10.28
Динамический Tseries в chart


15-1190712172
Layner
2007-09-25 13:22
2007.10.28
Чем отличается программа с "Designed for Vista" от 2000/XP напр.?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский