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

Вниз

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

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

Наверх




Память: 0.48 MB
Время: 0.008 c
6-44321
ррра45
2003-02-18 19:31
2003.04.14
Как использовать ф-цию bind?


9-43978
Dankin
2002-11-12 01:42
2003.04.14
Как создать dll с картинками.


6-44307
_MAD_
2003-02-15 23:19
2003.04.14
Дружда cgi и делфи


9-43983
RAVEN
2002-11-10 08:57
2003.04.14
Файл md2?


14-44408
FLIZ
2003-03-28 15:21
2003.04.14
Как определить длину RTF текста? (+)





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