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 писал(а):
Для КП:
Код:
   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;
Ну, и что? Я не вижу аналога union... В коде вручную приводить по типу?

Автор:  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/