OberonCore https://forum.oberoncore.ru/ |
|
Определить одинаковость типов https://forum.oberoncore.ru/viewtopic.php?f=86&t=6250 |
Страница 1 из 1 |
Автор: | Rifat [ Вторник, 15 Май, 2018 12:58 ] |
Заголовок сообщения: | Определить одинаковость типов |
Допустим, есть программа: Код: TYPE RecordBase = RECORD END; Base = POINTER TO RecordBase; RecordType1 = RECORD (RecordBase) a: INTEGER END; Type1 = POINTER TO RecordType1; RecordType2 = RECORD (RecordBase) c: ARRAY 10 OF CHAR END; Type2 = POINTER TO RecordType2; VAR array: ARRAY 3 OF Base; t1: Type1; t2: Type2; t3: Type1; BEGIN NEW(t1); NEW(t2); NEW(t3); array[0] := t1; array[1] := t2; array[2] := t3; Как программно можно определить, что array[i]^ := array[j]^ можно делать, если i = 0 и j = 2 и нельзя делать, если i = 0 и j = 1? |
Автор: | Comdiv [ Вторник, 15 Май, 2018 13:24 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Из чего следует, что можно, а что нельзя? Это задаётся постановкой задачи? Контекст не ясен. |
Автор: | Rifat [ Вторник, 15 Май, 2018 13:36 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Смотрите, есть массив указателей базового типа. Туда можно присвоить и указатель, который наследуется от базового. Можно присваивать содержимое записи, указатель на которую хранится в третьей (индекс 2) ячейке массива, записи, указатель на которую хранится в первой (индекс 0) ячейке массива, так как они одного типа. Но нельзя присваивать содержимое записи, указатель на которую хранится во второй (индекс 1) ячейке массива, записи, указатель на которую хранится в первой (индекс 0) ячейке массива, так как они разных типов, хотя оба они и наследуются от одного базового типа. Если попытаться сделать такое присваивание, то произойдет run-time ошибка. Как до присваивания, можно проверить, одного они типа или нет, если одного, то присваивать, а если не одного, то не присваивать? |
Автор: | Comdiv [ Вторник, 15 Май, 2018 14:24 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Rifat писал(а): Если попытаться сделать такое присваивание, то произойдет run-time ошибка. А не должна бы. Речь ведь об Обероне-07? Так как типы выражений одинаковы - это RecordBase, и раз тело RecordBase пусто, то присваивание не имеет никакого эффекта. Конечно, это не прояснено в описании языка, но его давно следует уточнить.
|
Автор: | Rifat [ Вторник, 15 Май, 2018 16:19 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Понял, о чем вы говорите, действительно, я написал не совсем то, что хотел спросить. Если не писать охрану типа array[0](Type1), то действительно пустые записи должны присваиваться. Допустим, есть другой массив: Цитата: VAR Value: ARRAY 3 OF INTEGER; И надо сделать Value[i] := Value[j], если array[i] и array[j] одного типа. Как понять, что array[i] и array[j] одного типа? |
Автор: | Comdiv [ Вторник, 15 Май, 2018 17:15 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Придётся снабжать RecordBase вспомогательной информацией о типе в том или ином виде. В общем случае базовыми средствами убедиться в идентичности типов не получится. |
Автор: | Rifat [ Вторник, 15 Май, 2018 17:39 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Или надо, вводить какие-то дополнительные средства, чтобы получить тип в run-time (Реализация, в любом случае должна где-то хранить эту информацию, для run-time проверок). |
Автор: | Пётр Кушнир [ Вторник, 15 Май, 2018 22:11 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Код: Services.SameType/Services.Is/Services.Extends
|
Автор: | Comdiv [ Вторник, 15 Май, 2018 23:42 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Вроде бы речь про Oberon-07, а не Blackbox с его спецификой. |
Автор: | Пётр Кушнир [ Вторник, 15 Май, 2018 23:52 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Тег типа, вокруг которого вся "возня" - это не специфика, это у каждого Оберона есть. Хотя конечно из темы непонятно, что про Оберон07. |
Автор: | Comdiv [ Среда, 16 Май, 2018 00:07 ] |
Заголовок сообщения: | Re: Определить одинаковость типов |
Да, но реализована она может быть сильно по разному и предоставлять или не предоставлять разное специальное API. Для общего случая надо писать явно. Рифат любит недосказанность. Оберон-07 выходит из того, что базовая запись расширима по умолчанию. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |