OberonCore
https://forum.oberoncore.ru/

Массивная совместимость
https://forum.oberoncore.ru/viewtopic.php?f=29&t=6590
Страница 1 из 1

Автор:  adimetrius [ Суббота, 21 Март, 2020 22:18 ]
Заголовок сообщения:  Массивная совместимость

Коллеги,

из определения понятия Array compatible в Language Report я делаю вывод, что при следующих определениях:
Код:
TYPE
  A = POINTER TO RECORD END;
  B = POINTER TO RECORD (A) END;
VAR b: POINTER TO ARRAY OF B;
PROCEDURE P (a: POINTER TO ARRAY OF A);

является некорректным выражение
Код:
P(b)

Штатный компилятор со мной соглашается и признает такое выражение некорректным.

Но ведь ∀i: b[i] IS A, и этот факт гарантируется проверкой типов при компиляции (т.е. не зависит от фактических типов переменных b[i]). И, кмк, передав b процедуре P мы "оправдаем" все ее ожидания.

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

Автор:  adimetrius [ Воскресенье, 22 Март, 2020 02:35 ]
Заголовок сообщения:  Re: Массивная совместимость

А, все, разобрался, вот пример, почему нельзя:

Код:
PROCEDURE P (a: POINTER TO ARRAY OF A);
  VAR c: POINTER TO RECORD (A) END;
BEGIN a[0] := c                                            (*)
END P;


После P(b) фактический массив а^ имеет тип элемента B, что несовместимо по присваиванию в (*) и не может быть выявлено при компиляции.

Но что если сделать
PROCEDURE Q (IN a: ARRAY OF A);

При Q(b) фактический массив a^ по-прежнему имеет тип элемента В, что опять несовместимо по присваиванию; однако присваивание запрещено, поскольку исп режим IN. И дальше передать a[i] в качестве VAR и OUT параметра нельзя - получается, а[i] защищено и неизменно; изменяться могут только его поля, что не нарушает целостности, поскольку в любом фактическом a[i] есть все поля A.

Или все-таки есть контрпример или опровергающее рассуждение?

Автор:  Илья Ермаков [ Воскресенье, 22 Март, 2020 12:57 ]
Заголовок сообщения:  Re: Массивная совместимость

Да, на тему совместимости массивов из типов-расширений надо подумать, это периодически "поджимает".

Возможно, подошло бы решение с типом ANYARRAY и WITH к массивам.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/