OberonCore
https://forum.oberoncore.ru/

откуда берутся значения?
https://forum.oberoncore.ru/viewtopic.php?f=35&t=6542
Страница 1 из 1

Автор:  snark [ Вторник, 21 Январь, 2020 19:00 ]
Заголовок сообщения:  откуда берутся значения?

имеется программа.При нажатии на коммандер выдает "5 в квадрате это 25" при всех следующих нажатиях "16 в квадрате это 256" Вопрос: почему так?Ведь начальные числа 5 и 16 нигде явно не указаны?Тут только одни иксы стоят?

MODULE MModul;

IMPORT
In, Out;

PROCEDURE Quadrat ( x : INTEGER ) : INTEGER;
BEGIN
RETURN x*x;
END Quadrat;

PROCEDURE MW*;
VAR
x : INTEGER;
BEGIN
In.Open; In.Int(x);
Out.Int(x,1); Out.String(" в квадрате это ");
Out.Int(Quadrat(x),1);
Out.String("."); Out.Ln;
END MW;

BEGIN
Out.Open;
END MModul.

MModul.MW

Автор:  Comdiv [ Вторник, 21 Январь, 2020 19:54 ]
Заголовок сообщения:  Re: откуда берутся значения?

Данные берутся с того самого стека, который обеспечивает хранилище для локальных переменных. Что там лежало до вызова процедуры, то и будет значением соответствующей переменной. Иван уже отвечал про схожую ситуацию

Автор:  Иван Денисов [ Вторник, 21 Январь, 2020 20:45 ]
Заголовок сообщения:  Re: откуда берутся значения?

Тут скорее всего идет считывание данных с помощью модуля In.
Код:
In.Open; In.Int(x);

Он берет данные из фокуса пользовательского ввода.

Автор:  Comdiv [ Вторник, 21 Январь, 2020 21:19 ]
Заголовок сообщения:  Re: откуда берутся значения?

В случае невозможности прочитать - ~In.Done, x остаётся неинициализированной

Автор:  Иван Денисов [ Среда, 22 Январь, 2020 06:21 ]
Заголовок сообщения:  Re: откуда берутся значения?

Comdiv писал(а):
В случае невозможности прочитать - ~In.Done, x остаётся неинициализированной


Вот так было бы правильно?
Код:
PROCEDURE MW*;
VAR
x : INTEGER;
BEGIN
   In.Open; In.Int(x);
   IF In.Done THEN
      Out.Int(x,1); Out.String(" в квадрате это ");
      Out.Int(Quadrat(x),1);
      Out.String("."); Out.Ln;
   END
END MW;


Давно не заходил в этот модуль, и никогда не анализировал, так что удивился, что глобальная переменная не соответствует соглашению об именовании переменных.
Должно быть
Код:
IF In.done THEN
с маленькой буквы.

Видимо это объясняется тем, что для книги так надо
Цитата:
This module is provided for compatibility with the book "Programming in Oberon" by Reiser/Wirth. It is useful when learning the language. It is not recommended for use in production programs.

Автор:  Comdiv [ Среда, 22 Январь, 2020 11:47 ]
Заголовок сообщения:  Re: откуда берутся значения?

Иван Денисов писал(а):
Вот так было бы правильно?
Да

Автор:  adimetrius [ Среда, 22 Январь, 2020 12:58 ]
Заголовок сообщения:  Re: откуда берутся значения?

И еще: в книге, возможно, используется In.Int, а в ББ удобно для тестов использовать:

MODULE M;

IMPORT Log;

PROCEDURE DoSomething* (x, y: INTEGER);
BEGIN Log.Int(x + y); Log.Ln
END DoSomething;

PROCEDURE Length* (IN s: ARRAY OF CHAR);
BEGIN Log.String("Длина строки:"); Log.Int(LEN(s$)); Log.Ln
END Length;

END M.

:!: "M.DoSomething(2, 3)"
:!: "M.DoSomething('Hello BlackBox!')"

ПС Если в коммандере передаются параметры, обязательно заключать в кавычки весь вызов. Строковые константы - в апострофах, и допускаются только для IN-параметров процедур.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/