OberonCore https://forum.oberoncore.ru/ |
|
Собственные типы https://forum.oberoncore.ru/viewtopic.php?f=35&t=6117 |
Страница 1 из 2 |
Автор: | Александр К [ Пятница, 29 Сентябрь, 2017 20:12 ] |
Заголовок сообщения: | Собственные типы |
Кто-нибудь напишите как пользоваться собтвенными типами, как их объявлять. Краткий ЛекБез. |
Автор: | Александр К [ Суббота, 30 Сентябрь, 2017 15:41 ] |
Заголовок сообщения: | Re: Собственные типы |
Например, в чём разница между Код: TYPE a = RECORD b: INTEGER; c: BOOLEAN END; VAR d: a; и Код: VAR d: RECORD
b: INTEGER; c: BOOLEAN END; |
Автор: | Rifat [ Суббота, 30 Сентябрь, 2017 15:47 ] |
Заголовок сообщения: | Re: Собственные типы |
Александр К писал(а): Например, в чём разница между Код: TYPE a = RECORD b: INTEGER; c: BOOLEAN END; VAR d: a; и Код: VAR d: RECORD b: INTEGER; c: BOOLEAN END; Тип a, можно использовать для описания других переменных и для описания параметров. И все переменные этого типа будут совместимы с этим параметром функции. А если допустим, использовать переменную d и пытаться подставлять её в параметр функции типа a, то компилятор будет ругаться, что типы не совпадают. |
Автор: | Александр К [ Воскресенье, 01 Октябрь, 2017 07:44 ] |
Заголовок сообщения: | Re: Собственные типы |
Цитата: Тип 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. |
Автор: | Александр К [ Воскресенье, 01 Октябрь, 2017 08:57 ] |
Заголовок сообщения: | Re: Собственные типы |
В старом Паскале были записи с вариантами (использовался оператор 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; В КП есть ли что-то подобное записи с вариантами? |
Автор: | Иван Денисов [ Воскресенье, 01 Октябрь, 2017 09:02 ] |
Заголовок сообщения: | Re: Собственные типы |
нет, таких CASE в RECORD не предусмотрено |
Автор: | Comdiv [ Воскресенье, 01 Октябрь, 2017 13:59 ] |
Заголовок сообщения: | Re: Собственные типы |
Александр К писал(а): чем VAR отличается от TYPE? Потому что в обоих случаях переменные одного и того же типа. Но при задании имени типу через 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; |
Автор: | Comdiv [ Воскресенье, 01 Октябрь, 2017 14:16 ] |
Заголовок сообщения: | Re: Собственные типы |
Александр К писал(а): В старом Паскале были записи с вариантами (использовался оператор 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 |
Автор: | Wlad [ Воскресенье, 01 Октябрь, 2017 17:02 ] |
Заголовок сообщения: | Re: Собственные типы |
Александр К писал(а): Это понятно, но чем VAR отличается от TYPE? Есть разный подход "тИповой совместимости" в языках программирования (вернее в их компиляторах). Совместимость по структуре типа и совместимость по имени типа. В виртовских языках и языках-"наследниках" паскаля (Модула-2, Оберон, КП, Ада) принята совместимость типов по именам. Принято перед объявлением переменной, ещё и объявить тип. Есть случаи послабления этого требования. Но они, чаще всего связаны с низкоуровневыми вещами и, что бы ими воспользоваться, необходимо в программе написать больше слов и приложить усилий. И ЭТО - ПРАВИЛЬНО. Для создания надёжных программ пусть лучше программист чётко объяснит компилятору, что он делает, на что решается и от чего отказывается. Действительно низкоуровневое программирование - удел и привилегия относительно небольшого процента разработчиков. Они составляют категорию людей, труд которых связан с, по-настоящему, критичными и опасными вещами. Когда опасные и рискованные части и фрагменты программ не требуют высокого порога осведомлённости и "дешевы" в затратности и лёгкости использования, у общей массы кодописателей возникает соблазн и убеждение, что "если так можно (и можно легко), то так и надо (и надо всегда и везде)". В то же время модель совместимости по именам типов значительно упрощает работу компилятора, делает работу анализирующих и проверочных частей проще и формальней. Ведь компилятор должен сравнить только имена, но не начинает детальное сравнение по набору полей, их типов, порядка их расположения в типе/записи, выравнивание и размер. К тому же, сравнение на идентичность типов по именам намного правильнее методически. Программист именем типа идентифицирует понятие, с которым оперирует в методах и подпрограммах. И он ожидает, что это понятие будет подразумевать одно и то же в разных местах. И в этих местах не нужно проводить "дополнительные уточнения" ни программисту, ни компилятору. |
Автор: | Александр К [ Воскресенье, 01 Октябрь, 2017 17:17 ] |
Заголовок сообщения: | Re: Собственные типы |
Comdiv писал(а): Что-то подобное заключается в расширении записей. При этом обязательно придётся наследовать хотябы одно поле. А если не требуется наследование ни одного поля? Записи с вариантами такое позволяли. |
Автор: | Rifat [ Воскресенье, 01 Октябрь, 2017 17:35 ] |
Заголовок сообщения: | Re: Собственные типы |
В Обероне можно наследоваться от пустой записи. |
Автор: | Kemet [ Воскресенье, 01 Октябрь, 2017 21:23 ] |
Заголовок сообщения: | Re: Собственные типы |
В Компонентном Паскале есть же объединения UNION |
Автор: | Иван Денисов [ Воскресенье, 01 Октябрь, 2017 21:28 ] |
Заголовок сообщения: | Re: Собственные типы |
Kemet писал(а): В Компонентном Паскале есть же объединения UNION Впервые слышу... а что имеете в виду? |
Автор: | Kemet [ Воскресенье, 01 Октябрь, 2017 21:32 ] |
Заголовок сообщения: | Re: Собственные типы |
T = RECORD [union] ... END |
Автор: | Иван Денисов [ Воскресенье, 01 Октябрь, 2017 21:48 ] |
Заголовок сообщения: | Re: Собственные типы |
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. Ну это лучше использовать только для привязок к другим библиотекам. А на КП так лучше не писать. |
Автор: | Kemet [ Воскресенье, 01 Октябрь, 2017 21:52 ] |
Заголовок сообщения: | Re: Собственные типы |
Да запихать в нормальную запись на место case и нормально будет |
Автор: | Kemet [ Воскресенье, 01 Октябрь, 2017 21:53 ] |
Заголовок сообщения: | Re: Собственные типы |
человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет |
Автор: | Иван Денисов [ Воскресенье, 01 Октябрь, 2017 22:12 ] |
Заголовок сообщения: | Re: Собственные типы |
Kemet писал(а): человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет Тут соглашусь с Wlad. Не будет работать сборщик мусора, не будут работать проверки. Зачем тогда использовать КП, не понятно. |
Автор: | Info21 [ Воскресенье, 01 Октябрь, 2017 22:13 ] |
Заголовок сообщения: | Re: Собственные типы |
Почему никто не сообщает про штатную возможность -- что вместо case в записях нужно определить базовый тип и группу наследников (на каждый case), и вместо case будет WITH. |
Автор: | Kemet [ Понедельник, 02 Октябрь, 2017 09:24 ] |
Заголовок сообщения: | Re: Собственные типы |
Иван Денисов писал(а): Kemet писал(а): человек хочет case в записи, ну так дайте ему и объясните, что почему и зачем. Он сам решит, нужно ему это или нет Тут соглашусь с Wlad. Не будет работать сборщик мусора, не будут работать проверки. Зачем тогда использовать КП, не понятно. всё будет, просто нужно объяснить, в каких случаях это может вызвать проблемы, и в не использовать указатели в объединении |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |