Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 19 июн 2025, 19:52

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Ввод/вывод
СообщениеДобавлено: 14 ноя 2013, 14:59 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
В языке нет встроенных операторов ввода/вывода, как например, в Basic`е оператор print. Как быть?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ввод/вывод
СообщениеДобавлено: 14 ноя 2013, 16:51 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
Len писал(а):
В языке нет встроенных операторов ввода/вывода, как например, в Basic`е оператор print. Как быть?

Если нет чего-то встроенного, то нужно подключить модуль, в котором это есть.
Так для простейшего вывода (для изучения языка или отладки), можно использовать модуль StdLog, входящий во все сборки BlackBox. Вот пример (из набора примеров, который тоже стандартно входит во все сборки):
Код: "OBERON"
  1. MODULE ObxHello0;
  2.  
  3. IMPORT StdLog;
  4.  
  5. PROCEDURE Do*;
  6. BEGIN
  7. StdLog.String("Hello World"); StdLog.Ln (* write string and 0DX into log *)
  8. END Do;
  9.  
  10. END ObxHello0.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ввод/вывод
СообщениеДобавлено: 14 ноя 2013, 21:56 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Len писал(а):
В языке нет встроенных операторов ввода/вывода, как например, в Basic`е оператор print. Как быть?
Всё правильно. А знаете почему в Оберон не введены операции ввода-вывода на уровне языка? Да чтобы не привязывать язык, например, к консольному вводу-выводу. Вместо этого Оберон — эдакая вещь в себе, и рассматривает ввод-вывод как нечто относящееся к уровню взаимодействия с внешней средой, т.е. то, что может быть решено средствами языка, например, отдельными модулями или биндингами к платформе/ОС. Согласитесь, что это плохо, когда ввод-вывод намертво привязан к 16-цветной консоли с разрешением 80x25 символов, и такая пристройка в виде консоли рассматривается как неотъемлемая часть языка, как это было в Turbo Pascal. Это то, что касается теории "зачем сделано именно так, а не иначе".

Как же практически достичь ввода-вывода? Saferoll уже ответил насчёт BlackBox. Добавлю, что существует модуль консольного вывода для Windows.

"Дубовые требования" стандартизируют процесс ввода-вывода, но они поддержаны далеко не всеми реализациями Оберона. Когда-то Руслан Богатырёв хотел разработать стандартные библиотеки ввода/вывода для основных реализаций Оберона/Компонентного Паскаля, но дело вроде бы далее идеи не сдвинулось. Так что каждая реализация решает этот вопрос по-разному. Мартин Райзер в своей книге "Programming in Oberon" предлагает такой интерфейс для вывода:
Код: "OBERON"
  1. DEFINITION Out;
  2. PROCEDURE Open;
  3. PROCEDURE Char (ch: CHAR);
  4. PROCEDURE String (str: ARRAY OF CHAR);
  5. PROCEDURE Int (i, n: LONGINT);
  6. PROCEDURE Real (x: REAL; n: INTEGER);
  7. PROCEDURE LongReal (x: LONGREAL; n: INTEGER);
  8. PROCEDURE Ln;
  9. END Out.
XDS содержит свои библиотеки. В XDev/WinDev я использую для вывода модуль Console. На данный момент интерфейс выглядит примерно так:
Код: "OBERON"
  1. DEFINITION Console;
  2.  
  3. PROCEDURE At (x: INTEGER; y: INTEGER);
  4. PROCEDURE Clear (colors: INTEGER);
  5. PROCEDURE SetColors (n: GrColors.Colors);
  6. PROCEDURE SetFont (font: ARRAY [1] OF SYSTEM.BYTE);
  7. PROCEDURE WriteCh (ch: CHAR);
  8. PROCEDURE WriteHex (val: INTEGER);
  9. PROCEDURE WriteInt (n: LONGINT);
  10. PROCEDURE WriteIntWidth (x: INTEGER; n: INTEGER);
  11. PROCEDURE WriteLn;
  12. PROCEDURE WriteStr (str: ARRAY [1] OF CHAR);
  13. PROCEDURE WriteStrLn (str: ARRAY [1] OF CHAR);
  14.  
  15. END Console.

Так что с вводом-выводом в Оберонах дела обстоят немного сложнее, чем хотелось бы. Просто ввод-вывод — он ведь разный бывает. И в графическое окно. И юникодный. И поверх рисунков, с прозрачностью. И векторными шрифтами. Так что пусть лёгкость вывода PRINT'ом в Basic'е Вас не обманывает. Всё равно люди вынуждены выйти за рамки возможностей PRINT (см., например, развитие Basic'а — язык программирования Monkey).


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ввод/вывод
СообщениеДобавлено: 01 май 2016, 07:10 
Не в сети

Сообщения: 1
Пожалуйста, подскажите.
Как в Log выводить строковую константу?

Например:
Код: "OBERON"
  1.  
  2. CONST
  3. ru = "Россия";
  4.  


Плохо получается, если использовать
Код: "OBERON"
  1.  
  2. StdLog.String (ru);
  3.  


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Ввод/вывод
СообщениеДобавлено: 02 май 2016, 12:56 
Не в сети
Администратор
Аватара пользователя

Сообщения: 273
Откуда: Россия
А что именно плохо? Может быть перехода на новую строку StdLog.Ln не хватает?
Переделал пример из ББ:
Код: "OBERON"
  1. MODULE ObxHello0;
  2.  
  3. IMPORT StdLog;
  4.  
  5. CONST
  6. ru = "Россия";
  7.  
  8. PROCEDURE Do*;
  9. BEGIN
  10. StdLog.String(ru); StdLog.Ln
  11. END Do;
  12. END ObxHello0.

Всё хорошо выводит.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club