Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Найти ошибку в задачке

Автор: Xandr 7.12.2003 23:55

Доброе время суток. Если у кого время есть - то у меня такая трабла.

Цитата

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 8.12.2003 0:27

exe - есть то попробуй протресить через отладчик
для ASM

Автор: Xandr 8.12.2003 1:46

в любом случае получается, что до * i=99, а при выполнении строки i+f сначала выполняется f, "затирающая" i на "0", а только затем - "0+0". как этот приоритет можно изменить?

Автор: trminator 8.12.2003 13:30

Я так понимаю, что для того, чтобы вычислить значение {*}, он сначала считает значение функции f (надо же ему знать, с чем складывать), и уж затем прибавляет к нему значение i, которая к тому моменту равна нулю

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

Код

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


ЗЫ Все нормально трейсится, BP7.0 и Delphi5 пробовал, один результат