OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 10 Июль, 2020 16:33

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 18:27 

Зарегистрирован: Четверг, 18 Март, 2010 07:19
Сообщения: 14
Здравствуйте.
Посоветуйте чем заменить перечислимые типы в компонентном паскале?
например:
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; компилятор выдавал ошибку нарушения
типов.

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

Саша Кулов


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 18:33 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Перечисляемых типов нет.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 18:42 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2651
Откуда: Россия, Ярославль
Цитата:
Приложение B: Отличия Компонентного Паскаля от Паскаля
© Английский оригинал: Oberon microsystems, 1994-2001.
© Перевод на русский язык: Ф.В.Ткачев, апрель 2001, март 2009.

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

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 18:51 

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

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

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


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


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

sasha-kulov

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 18:58 

Зарегистрирован: Четверг, 18 Март, 2010 07:19
Сообщения: 14
Проверку можно сделать в виде функции.
Проверять от мин до макс значения.
IF (значение >= мин_ЛАД) AND (значение <= MAX_ЛАД) THEN[/quote]

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 19:02 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
sasha-kulov писал(а):
Спасибо, а куда эту функцию подцепить,
и будет ли обнаружена ошибка на этапе компиляции?



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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 19:08 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Можно конечно сделать так
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;

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 20:16 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Цитата:
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 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 22:07 

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

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

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

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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 24 Декабрь, 2013 09:12 

Зарегистрирован: Четверг, 18 Март, 2010 07:19
Сообщения: 14
Comdiv писал(а):
Эти лады-струны просто для примера или всерьёз?

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

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


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


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

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB