Помощь - Поиск - Пользователи - Календарь
Полная версия: Найти ошибку в задачке
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Xandr
Доброе время суток. Если у кого время есть - то у меня такая трабла.
Цитата

Var
   i :integer;
Procedure p1;
 Procedure p2;
 var i : real;
 begin
   i:=2;
 end;
Begin
i:=99;
p2;
end;
function f: integer;
begin
i:=0;
f:=i;
end;

BEGIN
 p1;
{*}  Writeln(i+f);
{**}  Writeln(f+i);
END.

по условию * должно выводить "99", а ** - "0".
Но writeln(i+f) выдает тоже "0", т.е в строке * сначала  высчитывается значение функции f, в лишь затем выполняется сама строка.
А по условию writeln(i+f) должно выводить "99".
Надо объяснить, почему компилятор просматривает программу в таком порядке и предложить вариант исправления программы.
Весь прикол в том, что у меня паскаль эту программу даже трассировать отказывается - пишет "Error 202: Stack overflow error." - с чего бы это?
Надеюсь кто-нибудь разберется. Заранее благодарю.
Shadow
exe - есть то попробуй протресить через отладчик
для ASM
Xandr
в любом случае получается, что до * i=99, а при выполнении строки i+f сначала выполняется f, "затирающая" i на "0", а только затем - "0+0". как этот приоритет можно изменить?
trminator
Я так понимаю, что для того, чтобы вычислить значение {*}, он сначала считает значение функции f (надо же ему знать, с чем складывать), и уж затем прибавляет к нему значение i, которая к тому моменту равна нулю

а как обойти... вроде без введения еще одной переменной никак...
Код

var p: integer;
BEGIN
 p1;
p:=i;
{*}  Writeln(p+f);
{**}  Writeln(f+i);
END.


ЗЫ Все нормально трейсится, BP7.0 и Delphi5 пробовал, один результат
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.