IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Найти ошибку в задачке
сообщение
Сообщение #1


Гость






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

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." - с чего бы это?
Надеюсь кто-нибудь разберется. Заранее благодарю.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
сообщение
Сообщение #2


Lonely_Raven
****

Группа: Пользователи
Сообщений: 640
Пол: Мужской

Репутация: -  1  +


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


--------------------
Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ
---------------------
RTFM - Read the fucking manual
---------------------
http://www.livejournal.com/users/lonley_raven/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


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

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

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


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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.10.2020 21:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name