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/ |