OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 18 Ноябрь, 2018 23:26

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




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Собственные типы
СообщениеДобавлено: Пятница, 29 Сентябрь, 2017 20:12 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Кто-нибудь напишите как пользоваться собтвенными типами, как их объявлять. Краткий ЛекБез.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Суббота, 30 Сентябрь, 2017 15:41 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Например, в чём разница между
Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d: a;

и
Код:
VAR d: RECORD
b: INTEGER;
c: BOOLEAN
END;
 


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Суббота, 30 Сентябрь, 2017 15:47 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 727
Откуда: Казань
Александр К писал(а):
Например, в чём разница между
Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d: a;

и
Код:
VAR d: RECORD
b: INTEGER;
c: BOOLEAN
END;
 

Тип a, можно использовать для описания других переменных и для описания параметров. И все переменные этого типа будут совместимы с этим параметром функции.
А если допустим, использовать переменную d и пытаться подставлять её в параметр функции типа a, то компилятор будет ругаться, что типы не совпадают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 07:44 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Цитата:
Тип a, можно использовать для описания других переменных и для описания параметров. И все переменные этого типа будут совместимы с этим параметром функции.
А если допустим, использовать переменную d и пытаться подставлять её в параметр функции типа a, то компилятор будет ругаться, что типы не совпадают.

Это понятно, но чем VAR отличается от TYPE?
Например:
Код:
VAR d1, d2, d3: RECORD
b: INTEGER;
c: BOOLEAN
END;
...
d1:=d2;

Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d1, d2, d4: a;
...
d1:=d2;

В обоих примерах присваивание произойдёт.
Код:
d3:=d4;

Цитата:
компилятор будет ругаться, что типы не совпадают.

Я так понимаю, что это даёт слово RECORD.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 08:57 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
В старом Паскале были записи с вариантами (использовался оператор CASE):
Код:
entry = RECORD
author, title: STRING;
year: INTEGER;
CASE tag: entry OF
book: (publisher, cyty: STRING);
magazine:(magName: STRING; volume, issue: INTEGER)
END;
VAR reflist: entry;
BEGIN
reflist.tag := book;
reflist.cyty:= 'NEWYORK';
...
reflist.tag :=magazine;
reflist.volume:= 5;

В КП есть ли что-то подобное записи с вариантами?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 09:02 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2208
нет, таких CASE в RECORD не предусмотрено


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 13:59 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 725
Откуда: Киев
Александр К писал(а):
чем VAR отличается от TYPE?
Например:
Код:
VAR d1, d2, d3: RECORD
b: INTEGER;
c: BOOLEAN
END;
...
d1:=d2;
Код:
TYPE a = RECORD
b: INTEGER;
c: BOOLEAN
END;
VAR d1, d2, d4: a;
...
d1:=d2;
В обоих примерах присваивание произойдёт.
Потому что в обоих случаях переменные одного и того же типа. Но при задании имени типу через TYPE его можно будет использовать для объявлениях переменных этого типа в других местах. При использовании анонимной записи, переменные этого типа можно объявить только по месту объявления типа перечисленными через запятую именами. По-моему, это очень логично следует из текстового представления.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 14:16 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 725
Откуда: Киев
Александр К писал(а):
В старом Паскале были записи с вариантами (использовался оператор CASE):
Код:
entry = RECORD
author, title: STRING;
year: INTEGER;
CASE tag: entry OF
book: (publisher, cyty: STRING);
magazine:(magName: STRING; volume, issue: INTEGER)
END;
VAR reflist: entry;
BEGIN
reflist.tag := book;
reflist.cyty:= 'NEWYORK';
...
reflist.tag :=magazine;
reflist.volume:= 5;

В КП есть ли что-то подобное записи с вариантами?

Что-то подобное заключается в расширении записей. Наличие этого механизма сделало избыточными менее естественные записи с вариантами.
Код:
TYPE
  entry = EXTENSIBLE RECORD
    author, title: ARRAY 16 OF CHAR;
    year: INTEGER
  END;
  book = RECORD(entry)
    publisher, cyty: ARRAY 16 OF CHAR;
  END;
  magazine = RECORD(entry)
    magName: ARRAY 16 OF CHAR;
    volume, issue: INTEGER
  END;

VAR
  reflist: POINTER TO entry;
  ebook: POINTER TO book;
  emag: POINTER TO magazine;

BEGIN
  NEW(ebook);
  ebook.cyty := 'NEWYORK';
  reflist := ebook;

  NEW(emag);
  emag.volume:= 5;
  reflist := emag


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 17:02 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1337
Александр К писал(а):
Это понятно, но чем VAR отличается от TYPE?

Есть разный подход "тИповой совместимости" в языках программирования (вернее в их компиляторах).
Совместимость по структуре типа и совместимость по имени типа.
В виртовских языках и языках-"наследниках" паскаля (Модула-2, Оберон, КП, Ада) принята совместимость типов по именам.
Принято перед объявлением переменной, ещё и объявить тип.
Есть случаи послабления этого требования. Но они, чаще всего связаны с низкоуровневыми вещами и, что бы ими воспользоваться, необходимо в программе написать больше слов и приложить усилий.
И ЭТО - ПРАВИЛЬНО.
Для создания надёжных программ пусть лучше программист чётко объяснит компилятору, что он делает, на что решается и от чего отказывается. Действительно низкоуровневое программирование - удел и привилегия относительно небольшого процента разработчиков. Они составляют категорию людей, труд которых связан с, по-настоящему, критичными и опасными вещами.
Когда опасные и рискованные части и фрагменты программ не требуют высокого порога осведомлённости и "дешевы" в затратности и лёгкости использования, у общей массы кодописателей возникает соблазн и убеждение, что "если так можно (и можно легко), то так и надо (и надо всегда и везде)".

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 17:17 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 46
Comdiv писал(а):
Что-то подобное заключается в расширении записей.

При этом обязательно придётся наследовать хотябы одно поле. А если не требуется наследование ни одного поля? Записи с вариантами такое позволяли.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 17:35 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 727
Откуда: Казань
В Обероне можно наследоваться от пустой записи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 21:23 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 532
В Компонентном Паскале есть же объединения UNION


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 21:28 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2208
Kemet писал(а):
В Компонентном Паскале есть же объединения UNION

Впервые слышу... а что имеете в виду?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 21:32 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 532
T = RECORD [union]
...
END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 21:48 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2208
Kemet писал(а):
T = RECORD [union]
...
END

Ясно. Думал, что это с выравниванием связано. Теперь прочитал внимательнее:
Код:
union   7   Untagged record with all fields allocated at offset 0.
      The size of the record is equal to the size of the
      largest field.
      Used to emulate C union types.

Ну это лучше использовать только для привязок к другим библиотекам. А на КП так лучше не писать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 21:52 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 532
Да запихать в нормальную запись на место case и нормально будет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 21:53 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 532
человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 22:12 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2208
Kemet писал(а):
человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет

Тут соглашусь с Wlad. Не будет работать сборщик мусора, не будут работать проверки. Зачем тогда использовать КП, не понятно.


Последний раз редактировалось Иван Денисов Воскресенье, 01 Октябрь, 2017 22:13, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Воскресенье, 01 Октябрь, 2017 22:13 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7896
Откуда: Троицк, Москва
Почему никто не сообщает про штатную возможность -- что вместо case в записях нужно определить базовый тип и группу наследников (на каждый case), и вместо case будет WITH.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Собственные типы
СообщениеДобавлено: Понедельник, 02 Октябрь, 2017 09:24 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 532
Иван Денисов писал(а):
Kemet писал(а):
человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет

Тут соглашусь с Wlad. Не будет работать сборщик мусора, не будут работать проверки. Зачем тогда использовать КП, не понятно.

всё будет, просто нужно объяснить, в каких случаях это может вызвать проблемы, и в не использовать указатели в объединении


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

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


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

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


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

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