Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.037 c
5-1112134404
Hark-al-ada
2005-03-30 02:13
2005.11.27
Как вставить контрол в пункт попап-меню?


14-1130982517
-[ HAWK ]-
2005-11-03 04:48
2005.11.27
Прикрепление скинов


2-1131619743
oleg_v
2005-11-10 13:49
2005.11.27
WebBrowser


14-1131457826
Nic
2005-11-08 16:50
2005.11.27
Администрирование класса


14-1131542528
RDA
2005-11-09 16:22
2005.11.27
Компьютерная барахолка в Киеве




   Наверх