OberonCore
https://forum.oberoncore.ru/

Перечислимые типы в компонентном паскале?
https://forum.oberoncore.ru/viewtopic.php?f=35&t=4899
Страница 1 из 1

Автор:  sasha-kulov [ Воскресенье, 22 Декабрь, 2013 18:27 ]
Заголовок сообщения:  Перечислимые типы в компонентном паскале?

Здравствуйте.
Посоветуйте чем заменить перечислимые типы в компонентном паскале?
например:
TYPE
ТМомент: LONGINT; (*номер такта в сотых долях*)
ТЛад = (лад01, лад02, лад03, лад04, лад05, лад06, лад07, лад08, лад09, лад10, лад11, ла12 );
ТСтруны = (струна01, струна02, струна03, струна04, струна05, струна06);

ТНота = RECORD момент:ТМомент; струна:ТСтруна; лад:ТЛад END;

Чтобы при присваивании значений полям переменной типа ТНота происходила проверка типов
например:
VAR
нота:ТНота;

BEGIN
нота.момент:= 100;
нота.струна:= струна01;
нота.лад := лад03;
END;
И попытке присвоить нота.струна:=лад01; компилятор выдавал ошибку нарушения
типов.

Я программирую на дельфи, и мечтаю перейти на блакбос, а перечислимые типы мой конек,
без них, я как без рук .
Помогите, пожалуйста, с этим вопросом.

Саша Кулов

Автор:  Jordan [ Воскресенье, 22 Декабрь, 2013 18:33 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Перечисляемых типов нет.

Только константы.

Автор:  Пётр Кушнир [ Воскресенье, 22 Декабрь, 2013 18:42 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Цитата:
Приложение B: Отличия Компонентного Паскаля от Паскаля
© Английский оригинал: Oberon microsystems, 1994-2001.
© Перевод на русский язык: Ф.В.Ткачев, апрель 2001, март 2009.

Исключенные средства

• Перечислимые типы
Используйте вместо них целые константы.


https://bitbucket.org/oberoncore/bb-doc ... at=default

Автор:  Jordan [ Воскресенье, 22 Декабрь, 2013 18:51 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Пётр Кушнир писал(а):
Цитата:
Приложение B: Отличия Компонентного Паскаля от Паскаля
© Английский оригинал: Oberon microsystems, 1994-2001.
© Перевод на русский язык: Ф.В.Ткачев, апрель 2001, март 2009.

Исключенные средства

• Перечислимые типы
Используйте вместо них целые константы.


https://bitbucket.org/oberoncore/bb-doc ... at=default


Здравствуйте Пётр.
Ну, а я, что написал? Только константы.

sasha-kulov

Проверку можно сделать в виде функции.
Проверять от мин до макс значения.
IF (значение >= мин_ЛАД) AND (значение <= MAX_ЛАД) THEN

Автор:  sasha-kulov [ Воскресенье, 22 Декабрь, 2013 18:58 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Проверку можно сделать в виде функции.
Проверять от мин до макс значения.
IF (значение >= мин_ЛАД) AND (значение <= MAX_ЛАД) THEN[/quote]

Спасибо, а куда эту функцию подцепить,
и будет ли обнаружена ошибка на этапе компиляции?

Автор:  Jordan [ Воскресенье, 22 Декабрь, 2013 19:02 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

sasha-kulov писал(а):
Спасибо, а куда эту функцию подцепить,
и будет ли обнаружена ошибка на этапе компиляции?



BEGIN
нота.момент:= 100;
нота.струна:= SetСтруна(значение);
нота.лад := SetЛад(значение);
END;

Будет ошибка при выполнении программы.

Автор:  Jordan [ Воскресенье, 22 Декабрь, 2013 19:08 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Можно конечно сделать так
CONST
лад01 = 1;
лад02 = 2;
лад03 = 3;
лад04 = 4;
лад05 = 5;
лад06 = 6;
лад07 = 7;
лад08 = 8;
лад09 = 9;
лад10 = 10;
лад11 = 11;
лад12 = 12;

И при присваивании, быть внимательнее. Что бы вместо
нота.лад := лад03;

Не написать

нота.лад := Струна03;

Так как тип то один.

Автор:  Jordan [ Воскресенье, 22 Декабрь, 2013 20:16 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Цитата:
BEGIN
нота.момент:= 100;
нота.струна:= SetСтруна(значение);
нота.лад := SetЛад(значение);
END;


Такой код избыточен.

Всё можно упаковать в процедуру.

ТНота = RECORD
момент:INTEGER;
струна:INTEGER;
лад:INTEGER;
END;

PROCEDURE УстановитьНоту(Нота: TНота; Момент, Струна, Лад: INTEGER):
VAR
Н: TНота;
BEGIN
ASSERT(Момент >= МИН_МОМЕНТ AND Момент <= МАКС_МОМЕНТ);
ASSERT(Струна >= МИН_СТРУНА AND Струна <= МАКС_СТРУНА);
ASSERT(Лад >= МИН_ЛАД AND Лад <= МАКС_ЛАД);

Н.Момент := Момент;
Н.Струна := Струна;
Н.Лад := Лад;

И дальше ваш код
END;
VAR
Нота: TНота;

УстановитьНоту(Нота, 0, 2, 9):

Как то так.

Автор:  Иван Кузьмицкий [ Воскресенье, 22 Декабрь, 2013 21:00 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Jordan писал(а):
Такой код избыточен.
Появилась мысль, что раз уж в примере множества объявляются по месту (с помощью перечисления), то и дальнейшие алгоритмы тоже строятся похоже - вручную определяя значения для полей. Наверное, описание предметной области производится с минимальным обобщением, для фиксации сущностей "на лету". Такой подход выгоден для быстрого старта, но приносит проблемы на этапе эволюции. Думаю, лучше попробовать пересмотреть архитектуру - возможно, надобность в перечислениях отпадёт сама собой.

Автор:  Comdiv [ Воскресенье, 22 Декабрь, 2013 22:07 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Эти лады-струны просто для примера или всерьёз? Мне кажется странным желание использовать члены перечисления, в названиях которых фигурирует их численные значения.
Чем "лад := 12" хуже чем "лад := лад12"?
Если при вызове функции, может быть не понятным, что к чему
"нота(5, 3)" менее очевидно, чем "нота(лад5, струна3)"
тогда можно назвать функцию как "НотаЛадСтруна(5, 3)"

Вообще, сколько ошибок на этапе компиляции Вы отловили с помощью такой системы типов? Если много, то на Компонентном Паскале можете соорудить эквивалент перечислениям, но с накладными расходами как-то так:
Код:
МОДУЛЬ М;
ТИП
    Лад* = ССЫЛКА НА ЗАПИСЬ
        зн: ЦЕЛ
    КОНЕЦ;

    Струна* = ССЫЛКА НА ЗАПИСЬ
        зн: ЦЕЛ
    КОНЕЦ;

ПЕРЕМ
    лад*: РЯД 13 ИЗ Лад;
    струна*: РЯД 7 ИЗ Струна;

ПРОЦЕДУРА Инициализация;
ПЕРЕМ и: ЦЕЛ;
НАЧАЛО
     ДЛЯ и := 1 ДО 12 ДЕЛАЙ
           НОВЫЙ(лад[и]);
           лад.зн  := и;
     КОНЕЦ;
     ДЛЯ и := 1 ДО 6 ДЕЛАЙ
           НОВЫЙ(струна[и]);
           струна.зн  := и;
     КОНЕЦ
КОНЕЦ Инициализация;

НАЧАЛО
    Инициализация
КОНЕЦ М.

...
н := нота(М.лад[5],  М.струна[3])

Если перечислений в программе будет нужно много, то замучаетесь, хотя конечно можно подумать о генераторе таких штук.

Кстати, гитары бывают 4-14 струнными, 19-36 ладовыми. Что делать со всем этим добром при жёстко забитых перечислениях?

Автор:  sasha-kulov [ Вторник, 24 Декабрь, 2013 09:12 ]
Заголовок сообщения:  Re: Перечислимые типы в компонентном паскале?

Comdiv писал(а):
Эти лады-струны просто для примера или всерьёз?

....
Если перечислений в программе будет нужно много, то замучаетесь, хотя конечно можно подумать о генераторе таких штук.

Кстати, гитары бывают 4-14 струнными, 19-36 ладовыми. Что делать со всем этим добром при жёстко забитых перечислениях?


Спасибо, сейчас попробую разобраться в этом коде.
Саша Кулов

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