Форум: "Основная";
Текущий архив: 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");
Ну и тд…
← →
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.041 c