OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 17 Август, 2018 08:23

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 12:58 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 696
Откуда: Казань
Допустим, есть программа:
Код:
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?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 13:24 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 680
Откуда: Киев
Из чего следует, что можно, а что нельзя? Это задаётся постановкой задачи? Контекст не ясен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 13:36 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 696
Откуда: Казань
Смотрите, есть массив указателей базового типа. Туда можно присвоить и указатель, который наследуется от базового. Можно присваивать содержимое записи, указатель на которую хранится в третьей (индекс 2) ячейке массива, записи, указатель на которую хранится в первой (индекс 0) ячейке массива, так как они одного типа. Но нельзя присваивать содержимое записи, указатель на которую хранится во второй (индекс 1) ячейке массива, записи, указатель на которую хранится в первой (индекс 0) ячейке массива, так как они разных типов, хотя оба они и наследуются от одного базового типа. Если попытаться сделать такое присваивание, то произойдет run-time ошибка.

Как до присваивания, можно проверить, одного они типа или нет, если одного, то присваивать, а если не одного, то не присваивать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 14:24 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 680
Откуда: Киев
Rifat писал(а):
Если попытаться сделать такое присваивание, то произойдет run-time ошибка.
А не должна бы. Речь ведь об Обероне-07? Так как типы выражений одинаковы - это RecordBase, и раз тело RecordBase пусто, то присваивание не имеет никакого эффекта. Конечно, это не прояснено в описании языка, но его давно следует уточнить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 16:19 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 696
Откуда: Казань
Понял, о чем вы говорите, действительно, я написал не совсем то, что хотел спросить.
Если не писать охрану типа array[0](Type1), то действительно пустые записи должны присваиваться.

Допустим, есть другой массив:
Цитата:
VAR
Value: ARRAY 3 OF INTEGER;

И надо сделать Value[i] := Value[j], если array[i] и array[j] одного типа.
Как понять, что array[i] и array[j] одного типа?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 17:15 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 680
Откуда: Киев
Придётся снабжать RecordBase вспомогательной информацией о типе в том или ином виде. В общем случае базовыми средствами убедиться в идентичности типов не получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 17:39 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 696
Откуда: Казань
Или надо, вводить какие-то дополнительные средства, чтобы получить тип в run-time (Реализация, в любом случае должна где-то хранить эту информацию, для run-time проверок).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 22:11 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
Код:
Services.SameType/Services.Is/Services.Extends


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 23:42 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 680
Откуда: Киев
Вроде бы речь про Oberon-07, а не Blackbox с его спецификой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Вторник, 15 Май, 2018 23:52 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
Тег типа, вокруг которого вся "возня" - это не специфика, это у каждого Оберона есть. Хотя конечно из темы непонятно, что про Оберон07.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определить одинаковость типов
СообщениеДобавлено: Среда, 16 Май, 2018 00:07 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 680
Откуда: Киев
Да, но реализована она может быть сильно по разному и предоставлять или не предоставлять разное специальное API. Для общего случая надо писать явно.
Рифат любит недосказанность. Оберон-07 выходит из того, что базовая запись расширима по умолчанию.


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

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


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

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


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

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