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/ |