OberonCore https://forum.oberoncore.ru/ |
|
Вариантная запись https://forum.oberoncore.ru/viewtopic.php?f=2&t=2253 |
Страница 1 из 1 |
Автор: | Роман М. [ Четверг, 21 Январь, 2010 21:35 ] |
Заголовок сообщения: | Вариантная запись |
Как такой кусок кода перенести в Оберон-2/КП? Код: union cairo_path_data_t {
struct { cairo_path_data_type_t type; int length; } header; struct { double x, y; } point; }; |
Автор: | Илья Ермаков [ Четверг, 21 Январь, 2010 21:45 ] |
Заголовок сообщения: | Re: Вариантная запись |
Если Вам надо делать взаимодействие наружу (т.е. соблюсти точно этот формат), то IMPORT SYSTEM - и дальше [union] (см. Особенности платформы). Иначе - перепроектировать тип. |
Автор: | Valery Solovey [ Пятница, 22 Январь, 2010 12:52 ] |
Заголовок сообщения: | Re: Вариантная запись |
Для КП: Код: TYPE
cairo_path_data_type_t = INTEGER; cairo_path_data_t = EXTENSIBLE RECORD END; header = RECORD (cairo_path_data_t) type : cairo_path_data_type_t; length : INTEGER; END; point = RECORD (cairo_path_data_t) x, y : REAL END; |
Автор: | Созерцатель [ Пятница, 22 Январь, 2010 12:58 ] |
Заголовок сообщения: | Re: Вариантная запись |
Valery Solovey писал(а): Для КП: Ну, и что? Я не вижу аналога union... В коде вручную приводить по типу?
Код: TYPE cairo_path_data_type_t = INTEGER; cairo_path_data_t = EXTENSIBLE RECORD END; header = RECORD (cairo_path_data_t) type : cairo_path_data_type_t; length : INTEGER; END; point = RECORD x, y : REAL END; |
Автор: | Info21 [ Пятница, 22 Январь, 2010 13:06 ] |
Заголовок сообщения: | Re: Вариантная запись |
Valery Solovey писал(а): Для КП: Чего-то не хватает? или мне кажется?
Код: TYPE cairo_path_data_type_t = INTEGER; cairo_path_data_t = EXTENSIBLE RECORD END; header = RECORD (cairo_path_data_t) type : cairo_path_data_type_t; length : INTEGER; END; point = RECORD x, y : REAL END; |
Автор: | Valery Solovey [ Пятница, 22 Январь, 2010 13:16 ] |
Заголовок сообщения: | Re: Вариантная запись |
Созерцатель писал(а): Ну, и что? Я не вижу аналога union... В коде вручную приводить по типу? Полного аналога union быть и не может. Приводить типы явно, потому что неявное приведение чревато ошибками.
|
Автор: | Valery Solovey [ Пятница, 22 Январь, 2010 13:18 ] |
Заголовок сообщения: | Re: Вариантная запись |
Info21 писал(а): Чего-то не хватает? или мне кажется? Спасибо, исправил.
|
Автор: | Созерцатель [ Пятница, 22 Январь, 2010 13:23 ] |
Заголовок сообщения: | Re: Вариантная запись |
Тогда что получается? Если с си переводим алгоритм, то тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо прямого обращения к полям (а потом уже - обращение)? Не понятно что выиграли, но получили более громоздкую запись. И - при объявлении типов, и - при приведении в функциях. |
Автор: | Илья Ермаков [ Пятница, 22 Январь, 2010 13:23 ] |
Заголовок сообщения: | Re: Вариантная запись |
Ну а в задачах, где это реально нужно (форматы, потоки всякие, сети..), носителем берётся File или ARRAY OF BYTE, к которому применяются библиотечные RecFrom.../RecTo.. (которые проверяют отсуствие в типе указателей). |
Автор: | Илья Ермаков [ Пятница, 22 Январь, 2010 13:24 ] |
Заголовок сообщения: | Re: Вариантная запись |
Созерцатель писал(а): Тогда что получается? Если с си переводим алгоритм, то тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо обращени я к полям (а потом уже - обращение)? Не понятно что выиграли, но получили более громоздкую запись. И - при объявлении типов и - при приведении в функциях. Нет! Если ПЕРЕВОДИМ алгоритм, то переписываем без union. А SYSTEM.union используем, если ОБРАЩАЕМСЯ вовне (к DLL и т.п.) и пишем интерфейсный модуль к этой библиотеке. |
Автор: | Созерцатель [ Пятница, 22 Январь, 2010 13:26 ] |
Заголовок сообщения: | Re: Вариантная запись |
Илья Ермаков писал(а): Созерцатель писал(а): Тогда что получается? Если с си переводим алгоритм, то тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо обращени я к полям (а потом уже - обращение)? Не понятно что выиграли, но получили более громоздкую запись. И - при объявлении типов и - при приведении в функциях. Нет! Если ПЕРЕВОДИМ алгоритм, то переписываем без union. А SYSTEM.union используем, если ОБРАЩАЕМСЯ вовне (к DLL и т.п.) и пишем интерфейсный модуль к этой библиотеке. Всё равно приведение нужно (а оно - громоздко), потому, что тип предка про поля в потомках не ведает, а аргумент - предок. |
Автор: | Илья Ермаков [ Пятница, 22 Январь, 2010 13:32 ] |
Заголовок сообщения: | Re: Вариантная запись |
Громоздко в смысле записи в исходнике? Или в плане операции во время выполнения? Приведение во время выполнения очень быстрое (в Обероне проверка типа идёт за фиксированное число операций, без поиска предков). |
Автор: | Valery Solovey [ Пятница, 22 Январь, 2010 13:47 ] |
Заголовок сообщения: | Re: Вариантная запись |
Созерцатель писал(а): ... тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо прямого обращения к полям...? К каким полям? К полям чего? Там оно есть? А если этот тип экспортируется из модуля (и там выполняется ещё одно уточнение типа), то появляется ещё и проблема, связанная с раздельной компиляцией.
|
Автор: | Сергей Губанов [ Пятница, 22 Январь, 2010 14:06 ] |
Заголовок сообщения: | Re: Вариантная запись |
Роман М. писал(а): Как такой кусок кода перенести в Оберон-2/КП? Так:Код: union cairo_path_data_t { struct { cairo_path_data_type_t type; int length; } header; struct { double x, y; } point; }; Код: IMPORT SYSTEM;
TYPE cairo_path_data_t = RECORD [union] header: RECORD [untagged] type: cairo_path_data_type_t; length: INTEGER END; point: RECORD [untagged] x, y: REAL END END; |
Автор: | Созерцатель [ Пятница, 22 Январь, 2010 14:38 ] |
Заголовок сообщения: | Re: Вариантная запись |
О, Господи! А это ещё что такое: [untagged] ? |
Автор: | Сергей Губанов [ Пятница, 22 Январь, 2010 16:14 ] |
Заголовок сообщения: | Re: Вариантная запись |
Созерцатель писал(а): О, Господи! А это ещё что такое: [untagged] ? Позволю себе ответить вместо вышестоящей инстанции к которой Вы обратились с вопросом... Директива [untagged] отключает тегирование RECORD делая его, как говориться unsafe, он превращается в plain C struct. |
Автор: | Роман М. [ Пятница, 22 Январь, 2010 18:49 ] |
Заголовок сообщения: | Re: Вариантная запись |
Нашёл время для продолжения составления модуля интерфейса Cairo. Спасибо за код. |
Автор: | Info21 [ Пятница, 22 Январь, 2010 22:29 ] |
Заголовок сообщения: | Re: Вариантная запись |
Сергей Губанов писал(а): Созерцатель писал(а): О, Господи! А это ещё что такое: [untagged] ? Позволю себе ответить вместо ... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |