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

Вниз

Обьясните ньюанс в Дельфи с вызовом Exit в функции.   Найти похожие ветки 

 
Карелин Артем ©   (2005-11-03 12:09) [0]

Если в функции вызываю Exit до инициализации возвращаемого значения, то результатом ее будет предыдущее значение. Почему неясно...
Дельфи 7
procedure TForm1.Button1Click(Sender: TObject);
function Test1(Value:integer):string;
 begin
  if Odd(Value) then exit;
  Result:=IntToStr(Value);
 end;
function Test2(Value:integer):string;
 begin
  if not Odd(Value) then Result:=IntToStr(Value) else Result:="";
 end;
var i,j:integer;
   s:string;
begin
s:="";
for i:=1 to 5 do
 s:=s+Test1(i);
ShowMessage(s);
s:="";
for i:=1 to 5 do
 s:=s+Test2(i);
ShowMessage(s);
end;


 
Baltika-31   (2005-11-03 12:12) [1]


>  Почему неясно...


А что неясно?

Ну возвращается некое значение. Совершенно не факт, что это будет предыдущее возвращенное значение.
Просто при повторном вызове адрес возвращаемого значения случайно совпал с предыдущим.


 
Игорь Шевченко ©   (2005-11-03 12:13) [2]


> function Test1(Value:integer):string;


> Почему неясно...


Вот потому что результат имеет тип string. Для такого результата передается неявный аргумент - ссылка на буфер, куда будет положен результат, размещается он в вызывающей функции. Поэтому ничего удивительного, что так остается предыдущее значение.


 
Gero ©   (2005-11-03 12:14) [3]

А вобще код ужасен.


 
Карелин Артем ©   (2005-11-03 12:14) [4]

Угу, с вероятностью 100% случайное значение совершенно случайно совпадает с предыдущим возвращенным.


 
Карелин Артем ©   (2005-11-03 12:21) [5]


> Gero ©   (03.11.05 12:14) [3]
> А вобще код ужасен.

Ну уж извините, не ради вашего любимого занятия писано.


 
ANB ©   (2005-11-03 12:30) [6]


> Карелин Артем ©   (03.11.05 12:21) [5]

А предупреждения тебе компилятор не выдал ?


 
Gero ©   (2005-11-03 12:42) [7]


> ANB ©   (03.11.05 12:30)

Вряд ли, компилятор воспринимает Exit как обычный вызов функции.


 
Baltika-31   (2005-11-03 12:47) [8]


> Карелин Артем ©   (03.11.05 12:14) [4]
>
> Угу, с вероятностью 100% случайное значение совершенно случайно
> совпадает с предыдущим возвращенным.


Заблуждение.
100% - это лишь твое личное впечатление.


 
icWasya ©   (2005-11-03 13:00) [9]

а перепишите код вот так

procedure TForm1.Button1Click(Sender: TObject);
var
 ResultForTest1:String;
procedure Test1(Value:integer;var Result:string);
begin
 if Odd(Value) then exit;
 Result:=IntToStr(Value);
end;
var
 ResultForTest2:String;
procedure Test2(Value:integer;var Result:string);
begin
 if not Odd(Value) then Result:=IntToStr(Value) else Result:="";
end;
var i,j:integer;
  s:string;
begin
s:="";
for i:=1 to 5 do begin
 Test1(i,ResultForTest1);
 s:=s+ResultForTest1;
end;
ShowMessage(s);
s:="";
for i:=1 to 5 do begin
 Test2(i,ResultForTest2);
 s:=s+ResultForTest2;
end;
ShowMessage(s);
end;

и посмотрите, что получится


 
Игорь Шевченко ©   (2005-11-03 13:04) [10]

Baltika-31   (03.11.05 12:47) [8]

View|Debug windows|CPU

До полного и окончательного просветления.


 
Baltika-31   (2005-11-03 13:32) [11]


> Игорь Шевченко ©   (03.11.05 13:04) [10]
>
> Baltika-31   (03.11.05 12:47) [8]
>
> View|Debug windows|CPU
>
> До полного и окончательного просветления.


1. Здесь не сайт фанатиков-медитаторов, чтобы просветлением заниматься.
2. Согласен в частном случае для строк. Но не уверен. View|Debug windows|CPU - не аргумент.


 
Игорь Шевченко ©   (2005-11-03 13:44) [12]

Baltika-31   (03.11.05 13:32) [11]

Ну можно почитать Object pascal reference, там оно тоже написано. Впрочем, в мою задачу входил ответ автору, каковую задачу я выполнил.


 
TUser ©   (2005-11-03 14:31) [13]

И не только со строкой будет предыдущее значение. Я когда-то задавал такой вопрос, только у меня был integer. Переменная result ведет себя как статическая, компилятор не отвечает за ее инициализацию, в отличае от локальных переменных, объявляенных в секции var.


 
NORDmen ©   (2005-11-03 14:32) [14]


> Вот потому что результат имеет тип string. Для такого результата
> передается неявный аргумент - ссылка на буфер, куда будет
> положен результат, размещается он в вызывающей функции.
> Поэтому ничего удивительного, что так остается предыдущее
> значение.

конечно, надо же учитывать что конечный код все равно asm,а вы программируете на языке высокого уровня, где вы не знаете что делает компилятор. знайте asm и архитектуру pc -не будет таких нубских вопросов 8)


 
Игорь Шевченко ©   (2005-11-03 14:35) [15]

NORDmen ©   (03.11.05 14:32) [14]

Знание asm и архитектуры здесь совершенно не при чем. Это реализация компилятора языка Object Pascal.


 
Карелин Артем ©   (2005-11-03 14:52) [16]

2 Игорь Шевченко
Спасибо за ответ.


 
Anatoly Podgoretsky ©   (2005-11-03 21:09) [17]

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


 
wp2 ©   (2005-11-03 23:51) [18]

Просто удивительно, что в самом элементарном могут возникнуть проблемы...


 
Lamer@fools.ua ©   (2005-11-04 09:14) [19]

>>Gero ©   (03.11.05 12:42) [7]

>Вряд ли, компилятор воспринимает Exit как обычный вызов функции.

Это что ж за функция такая, для которой вместо call компилятор генерирует jmp или ret? На самом деле, нет ворнинга именно из-за типа возвращаемого значения. См. [2].


 
Gero ©   (2005-11-04 11:42) [20]


> Lamer@fools.ua ©   (04.11.05 09:14)

Да, был не прав, спасибо.



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

Форум: "Потрепаться";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.022 c
2-1131782326
RiP
2005-11-12 10:58
2005.11.27
заполнить массив


2-1131697453
Perf2k2
2005-11-11 11:24
2005.11.27
DateTimePicker - нужно, чтобы он был пустым


2-1131468320
abcdefghi
2005-11-08 19:45
2005.11.27
STRINGGRID


1-1130751383
Бывалый
2005-10-31 12:36
2005.11.27
Интернациональный Edit


3-1129522217
Vista
2005-10-17 08:10
2005.11.27
Люди добрые помогите....





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