записи как Published поля

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
ger0strat
новенький
Сообщения: 40
Зарегистрирован: 13.05.2014 19:35:56

записи как Published поля

Сообщение ger0strat »

Доброго времени суток.
Вопрос скорее риторический. Понадобилось мне возыметь несколько published полей, являющихся группами по 3 строки. Т.к. окромя такой группировки от поля ничего более не требуется, решил использовать запись и столкнулся со внезапной проблемой: published могут быть только поля-объекты либо то, что умещается в native int. http://www.freepascal.org/docs-html/ref/refsu38.html#x89-1110006.6.5 На резонный вопрос "какого банана?" гугл гордо молчит, а потрошить fpc я пока не готов.
Да, можно таки использовать не запись, а объект. Пока так и сделал, но меня гложет мысль о том, что я использую лишние несколько байт просто из-за реализации fpc. Не критично, но гложет.
Но все же, в чем проблема?

ps еще можно сериализовать, но как-то изврат
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

ger0strat писал(а):но меня гложет мысль о том, что я использую лишние несколько бай


А не гложет мысль, что если бы можно было бы использовать record в качестве published, то пришлось бы работать со структурой неизвестной длины, содержащей поля, имеющие неизвестное смещение? Почему так - из-за блждь "оптимизации", разной для разных режимов компиляции, с вставлением разного рода мусора. А также будет соблазн туда сунуть разного рода скрытые указатели - т.е. строки и динамические массивы.

Кста:
whose size is less than or equal to a pointer,

ger0strat писал(а):published могут быть только поля-объекты либо то, что умещается в native int

Утверждения отнюдь не эквивалентны. В ангельском оригинале сказано, что published может быть то, что меньше или равно pointer. Указателя то есть. Где там native int? :D Сам указатель (pointer), по этой логике, тоже может быть published.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

published могут быть только поля-объекты либо то, что умещается в native int

Double емнип может быть публишед, такчто это не совсем верно.
Какой смысл в "записи как Published поля"?
Т.к. окромя такой группировки от поля ничего более не требуется

Для группировки в инспекторе?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

SSerge писал(а):
ger0strat писал(а):published могут быть только поля-объекты либо то, что умещается в native int

Утверждения отнюдь не эквивалентны. В ангельском оригинале сказано, что published может быть то, что меньше или равно pointer. Указателя то есть. Где там native int? :D Сам указатель (pointer), по этой логике, тоже может быть published.

Можете рассказать почему не компилится этот код?

Код: Выделить всё

{$MODE OBJFPC}
{$MODESWITCH AUTODEREF}
type
TFoo = class
private
  P: Pointer;
published 
  property Group: Pointer read P;
end;

begin
end.

Код: Выделить всё

p.pas(8,27) Error: This kind of property cannot be published
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Дож писал(а):Можете рассказать почему не компилится этот код?


Мог бы просто сказать, что чушь спорол и указатели в качестве published членов принципиально бессмысленны, потому запрещены.
ger0strat
новенький
Сообщения: 40
Зарегистрирован: 13.05.2014 19:35:56

Сообщение ger0strat »

SSerge писал(а):то пришлось бы работать со структурой неизвестной длины


Волков бояться - в лес не ходить. Для динамических массивов выход нашелся, почему не должен для записей. Смещения известны ибо есть packed.

SSerge писал(а):whose size is less than or equal to a pointer,


хватаем словарик и переводим: "размер которых меньше или равен размеру указателя"
native int, как и размер указателя определяется разрядностью системы (или компилятора). Собственно, разница в термине.

zub писал(а):Какой смысл в "записи как Published поля"?


такой же, какой и в published поле любого другого типа

Добавлено спустя 6 минут 46 секунд:
zub писал(а):Double емнип может быть публишед, такчто это не совсем верно.


вообще sizeof(double)=8, что вполне укладывается
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>вообще sizeof(double)=8, что вполне укладывается
нет, не укладывается. например на x86

>>такой же, какой и в published поле любого другого типа
и всетаки, какой?
ger0strat
новенький
Сообщения: 40
Зарегистрирован: 13.05.2014 19:35:56

Сообщение ger0strat »

zub писал(а):>>вообще sizeof(double)=8, что вполне укладывается
нет, не укладывается. например на x86


пока потестить не на чем, но подозреваю не все так просто)
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

что тут проверять?
sizeof(double)=8
sizeof(pointer)=4
sizeof(integer)=4
на x86

Сделано имхо для упрощения и унификации рантайм rtti вызовов. Никакого смысла в
Т.к. окромя такой группировки от поля ничего более не требуется

для published секции нет. Тут лежит то что сериализуется "автоматом" и лежащее тут должно быть максимально простым
ger0strat
новенький
Сообщения: 40
Зарегистрирован: 13.05.2014 19:35:56

Сообщение ger0strat »

Ну то есть про размер они у себя в хелпе написали исключительно ради прикола?

zub писал(а):Никакого смысла в

не понял, о чем и к чему это было

zub писал(а):Тут лежит то что сериализуется "автоматом" и лежащее тут должно быть максимально простым

ну да, объекты определенно проще устроены, чем записи. более того, записи сериализуются на раз.

полагаю пошел спор ради спора. тему можно закрывать
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>не понял, о чем и к чему это было
Было это к тому что записи в published не нужны

>>ну да, объекты определенно проще устроены, чем записи. более того, записи сериализуются на раз.
Ничего "на раз" не сериализуется, темболее записи.

>>полагаю пошел спор ради спора. тему можно закрывать
Спора тут и небыло. Есть странное желание, непонимание зачем оно нужно и почему неработает))
Ответить