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

Вниз

Обьясните ньюанс в Дельфи с вызовом 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.034 c
4-1127888849
Igi
2005-09-28 10:27
2005.11.27
Заблокировать клавиатуру


1-1130906088
GidraXP
2005-11-02 07:34
2005.11.27
Безопасность информации


3-1129306926
suharew
2005-10-14 20:22
2005.11.27
Trim в IBX


1-1130791479
Aragon
2005-10-31 23:44
2005.11.27
Передача по ссылке параметра в Dll-процедуру


14-1131486115
DK2DK2DK2
2005-11-09 00:41
2005.11.27
Контроль версий?