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

Вниз

Оптимизатор убирает нужную строчку?   Найти похожие ветки 

 
Num Lock   (2003-04-02 10:57) [0]

function ShowForm: Integer;
begin
Result:= 0;
<НЕКОТОРЫЙ КОД>
MainFrm:= TMainFrm.Create(Application);
try
Result:= MainFrm.ShowModal;
finally
MainFrm.Free;
end;
end;


При компиляции компилятор не включает в результирующий код первую строчку - Result:= 0; Из-за чего при возникновении ошибки при выполнении <НЕКОТОРОГО КОДА> возвращаемое функцией значение оказывается непроинициализированным.


 
Skier ©   (2003-04-02 11:00) [1]

Оптимизацию отключи...:)


 
Num Lock   (2003-04-02 11:03) [2]

А если её отключить, то все неиспользуемые функции из используемых модулей тоже прикомпилируются?


 
MVVD ©   (2003-04-02 11:04) [3]

Вставь Result:=0; в finally


 
Skier ©   (2003-04-02 11:05) [4]

Нет.
К оптимизации это не относится...


 
Anatoly Podgoretsky ©   (2003-04-02 12:02) [5]

Если произойдет ошибка, то значение возвращаемое функцие не определено.
Но оптимизатор не убирает нужных строчек, только не нужные, видимо у тебя в <НЕКОТОРЫЙ КОД> есть присвоение.


 
Skier ©   (2003-04-02 12:03) [6]

Согласен с Anatoly Podgoretsky.
Хорошо бы увидеть этот самый <НЕКОТОРЫЙ КОД> :)


 
Num Lock   (2003-04-02 12:29) [7]

Вот такой код написал специально, что бы вызвать ошибку. А функция находится в Dll:
function ShowDllForm: Integer;
begin
Result:= 0;
MainFrm.ShowModal;
MainFrm:= TMainFrm.Create(Application);
try
Result:= MainFrm.ShowModal;
finally
MainFrm.Free;
end;
end;


Проверил таким кодом:

try
i:= ShowDllForm;
finally
ShowMessage(IntToStr(i));
end;

Показывает "-1728232840", т.е. не инициализируется.


 
Skier ©   (2003-04-02 12:41) [8]

Чудеса какие-то...:)
1) А как насчёт соглашения о перечади параметров и передачи
Handle-a host-приложения ?
2) Отключение оптимизации тоже не помогает ?


 
Anatoly Podgoretsky ©   (2003-04-02 12:52) [9]

В случае ошибки возвращаемое значение не определено, бессысленно, надо просто обрабатывать ошибку.

try
try
i := ShowDllForm;
except
i := предопределенное значение при ошибки;
или что еще важнее, какие нибудь осмычленные действия при ошибке.
end;
finally
...


Толку в обработке нет, поскольку ты вылетишь на первый по уровню обработчик ошибки, если такого не будет, то вообще из программы.


 
Num Lock   (2003-04-02 12:56) [10]

>Skier © (02.04.03 12:41)
Попробовал - разместил функцию в том-же приложении.

function ShowForm: Integer;
var
Form2: TForm2;
begin
Result:= -1;
Form2.ShowModal;
Form2:= TForm2.Create(Application);
try
Result:= Form2.ShowModal;
finally
Form2.Free;
end;
end;

Многократная проверка с кодом указанном выше.
При включённой оптимизации - всё время i принимает разные значения.
При выключенной - строчка Result:= 0; не убирается, но ShowMessage(IntToStr(i)); показывает "309" (?????), пробовал запускать 5-6 раз.


 
Anatoly Podgoretsky ©   (2003-04-02 12:59) [11]

Настойчивый ты челоаек :-)


 
Skier ©   (2003-04-02 13:02) [12]

А ежели так :

function ShowForm: Integer;
var
Form2: TForm2;
begin
Result:= 1;
try
Form2.ShowModal;
Form2:= TForm2.Create(Application);
try
Result:= Form2.ShowModal;
finally
Form2.Free;
end; //try
except
Result := 0;
on E : Exception do ShowMessage(E.Message);
end; //try
end;



 
Num Lock   (2003-04-02 13:05) [13]

>В случае ошибки возвращаемое значение не определено, бессысленно.
Если присвоить возвращаемое значение глобальной переменной, то тогда оно может иметь иметь смысл (необходимость), даже если во время выполнения функции возникла ошибка. А всё-таки, почему всегда 309?


 
Anatoly Podgoretsky ©   (2003-04-02 13:09) [14]

Да потому что такое значение в ячейке памяти/регистре - просто случайное значение.
Еще раз пойми - при возникновении исключения возвращаемое значение неопределено


 
Num Lock   (2003-04-02 13:16) [15]

>>Anatoly Podgoretsky © (02.04.03 13:09)
Теперь понял, прошу прощения за безграмотность, наверно это элементарные вещи.

>>Skier © (02.04.03 13:02)
>>А ежели так

С небольшими исправлениями синтаксиса
"
on E : Exception do
begin
ShowMessage(E.Message);
Result := 0;
end;
"
всё правильно, первая строчка убирается, возвращается как и положено 0, обработка исключения прерывается.


 
Skier ©   (2003-04-02 13:18) [16]

>Num Lock (02.04.03 13:16)
"Ну теперь твоя душенька довольна ?" :)


 
Num Lock   (2003-04-02 13:19) [17]

Да, ненадолго удовлетворил потребность в познании.



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

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

Наверх




Память: 0.5 MB
Время: 0.013 c
3-44040
Roman_kv
2003-03-26 04:22
2003.04.14
Создание и изменения записи


6-44309
imp403
2003-02-20 00:43
2003.04.14
IdTelnet


1-44158
Шишкин Илья
2003-04-03 16:13
2003.04.14
помогите с TColor


4-44512
Dober_m@N
2003-02-14 20:51
2003.04.14
как поставить hooks для сочетания клавиш


6-44316
Adventure
2003-02-23 16:06
2003.04.14
Совсем смешной вопрос!