Форум: "Потрепаться";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизОбьясните ньюанс в Дельфи с вызовом Exit в функции. Найти похожие ветки
← →
Карелин Артем © (2005-11-03 12:09) [0]Если в функции вызываю Exit до инициализации возвращаемого значения, то результатом ее будет предыдущее значение. Почему неясно...
Дельфи 7procedure 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.014 c