OberonCore
https://forum.oberoncore.ru/

ANYTYPE to another ANYTYPE
https://forum.oberoncore.ru/viewtopic.php?f=81&t=2882
Страница 1 из 1

Автор:  Андрей [ Пятница, 01 Октябрь, 2010 12:33 ]
Заголовок сообщения:  ANYTYPE to another ANYTYPE

Кажется, CP не позволяет делать явное преобразование любого типа в любой другой, совпадающий с ним по размеру?
Например, запись одного типа в запись другого, но совместимого с первым по размеру занимаемой памяти;
или массив слов в массив байт, и наоборот?

Что Оберон-сообщество думает о таких возможностях языка?

Автор:  Rifat [ Пятница, 01 Октябрь, 2010 13:59 ]
Заголовок сообщения:  Re: ANYTYPE to another ANYTYPE

Возможно, вы просто не правильно вычислили размер обоих структур, нужно учитывать еще и выравнивание.

Автор:  Илья Ермаков [ Пятница, 01 Октябрь, 2010 14:37 ]
Заголовок сообщения:  Re: ANYTYPE to another ANYTYPE

Такая операция небезопасна.

Представьте, что в одной из записей есть указатели. В неё записывается мусор из другой. Сборщик мусора даёт сбой, если раньше программа сама не затрёт память по неверным адресам. Ключевой принцип современных безопасных языков - герметичность указателей.

Однако поработать с записями без указателей можно. В системном программировании это бывает нужно. Нужно использовать операции псевдомодуля SYSTEM (MOVE и др.). Смотрите в документации ББ раздел "Платформенно-зависимые особенности". Но злоупотреблять SYSTEM нельзя, это низкоуровневые средства.

Ещё есть вот такие вполне безопасные средства:
viewtopic.php?p=38136

Можно преобразовать запись в массив байт посредством RecToBytes - и обратно эти байты в запись посредством RecFromBytes. Однако эти процедуры проверяют, чтобы записи не имели полей-указателей.

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