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/