OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 10:52

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Вариантная запись
СообщениеДобавлено: Четверг, 21 Январь, 2010 21:35 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Как такой кусок кода перенести в Оберон-2/КП?
Код:
union cairo_path_data_t {
    struct {
   cairo_path_data_type_t type;
   int length;
    } header;
    struct {
   double x, y;
    } point;
};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Четверг, 21 Январь, 2010 21:45 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Если Вам надо делать взаимодействие наружу (т.е. соблюсти точно этот формат), то IMPORT SYSTEM - и дальше [union] (см. Особенности платформы).

Иначе - перепроектировать тип.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 12:52 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Для КП:
Код:
   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;


Последний раз редактировалось Valery Solovey Пятница, 22 Январь, 2010 13:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 12:58 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
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... В коде вручную приводить по типу?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:06 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
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;
Чего-то не хватает? или мне кажется?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:16 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Созерцатель писал(а):
Ну, и что? Я не вижу аналога union... В коде вручную приводить по типу?
Полного аналога union быть и не может. Приводить типы явно, потому что неявное приведение чревато ошибками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:18 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Info21 писал(а):
Чего-то не хватает? или мне кажется?
Спасибо, исправил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:23 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
Тогда что получается? Если с си переводим алгоритм, то тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо прямого обращения к полям (а потом уже - обращение)?
Не понятно что выиграли, но получили более громоздкую запись. И - при объявлении типов, и - при приведении в функциях.


Последний раз редактировалось Созерцатель Пятница, 22 Январь, 2010 13:24, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:23 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну а в задачах, где это реально нужно (форматы, потоки всякие, сети..), носителем берётся File или ARRAY OF BYTE, к которому применяются библиотечные RecFrom.../RecTo.. (которые проверяют отсуствие в типе указателей).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:24 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Созерцатель писал(а):
Тогда что получается? Если с си переводим алгоритм, то тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо обращени я к полям (а потом уже - обращение)?
Не понятно что выиграли, но получили более громоздкую запись. И - при объявлении типов и - при приведении в функциях.


Нет! Если ПЕРЕВОДИМ алгоритм, то переписываем без union.

А SYSTEM.union используем, если ОБРАЩАЕМСЯ вовне (к DLL и т.п.) и пишем интерфейсный модуль к этой библиотеке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:26 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
Илья Ермаков писал(а):
Созерцатель писал(а):
Тогда что получается? Если с си переводим алгоритм, то тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо обращени я к полям (а потом уже - обращение)?
Не понятно что выиграли, но получили более громоздкую запись. И - при объявлении типов и - при приведении в функциях.


Нет! Если ПЕРЕВОДИМ алгоритм, то переписываем без union.

А SYSTEM.union используем, если ОБРАЩАЕМСЯ вовне (к DLL и т.п.) и пишем интерфейсный модуль к этой библиотеке.

Всё равно приведение нужно (а оно - громоздко), потому, что тип предка про поля в потомках не ведает, а аргумент - предок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:32 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Громоздко в смысле записи в исходнике? Или в плане операции во время выполнения? Приведение во время выполнения очень быстрое (в Обероне проверка типа идёт за фиксированное число операций, без поиска предков).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 13:47 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Созерцатель писал(а):
... тип аргументов сишних функций (union cairo_path_data_t) так и остаётся таким же типом в функциях оберона (или КП?), а внутри этих функций - явное приведение вместо прямого обращения к полям...?
К каким полям? К полям чего? Там оно есть? А если этот тип экспортируется из модуля (и там выполняется ещё одно уточнение типа), то появляется ещё и проблема, связанная с раздельной компиляцией.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 14:06 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Роман М. писал(а):
Как такой кусок кода перенести в Оберон-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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 14:38 

Зарегистрирован: Вторник, 19 Январь, 2010 23:54
Сообщения: 136
О, Господи! А это ещё что такое: [untagged] ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 16:14 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Созерцатель писал(а):
О, Господи! А это ещё что такое: [untagged] ?
Позволю себе ответить вместо вышестоящей инстанции к которой Вы обратились с вопросом...

Директива [untagged] отключает тегирование RECORD делая его, как говориться unsafe, он превращается в plain C struct.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 18:49 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Нашёл время для продолжения составления модуля интерфейса Cairo.
Спасибо за код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вариантная запись
СообщениеДобавлено: Пятница, 22 Январь, 2010 22:29 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Сергей Губанов писал(а):
Созерцатель писал(а):
О, Господи! А это ещё что такое: [untagged] ?
Позволю себе ответить вместо ...
По-моему, в данном случае уже стоит советовать пойти и прочесть документацию. Там всего-то на эти темы страничек.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB