IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Вариантный SizeOf
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +



type
A = record
case boolean of
true: (t: integer);
false: (f: array [0 .. 9999] of integer);
end;


Мне нужна функция такого плана:
MySizeOf(A, True)=4
MySizeOf(A, False)=40000
То есть чтобы выдавала "рабочий" размер структуры в зависимости от выбора вариантного поля. Для работы с файлами пригодилась бы...
Такая стандартная есть?

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
То есть чтобы выдавала "рабочий" размер структуры в зависимости от выбора вариантного поля.
А здесь НЕТ вариантного поля. Есть просто список вариантов (в количестве 2 шт.). Чтоб появилось поле - его надо описывать...

Цитата
Такая стандартная есть?
Нет. Стандартно размер вариантной записи вычисляется как сумма
1) размера фиксированной части;
2) размера поля-селектора (если оно именованное);
3) размера наибольшего из вариантов для каждого значения селектора.

То есть, при использовании стандартной функции размер твоей записи ВСЕГДА будет равен sizeof(f), независимо ни от каких условий. Чтоб результаты были другими - придется писать свою функцию.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


А как-то выкрутиться можно?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






"Можно и зайца научить курить" (С)
Смысл в чем?

В том, чтобы при записи в файл писать нужное число байт? Ну, так у тебя ж поля в разных вариантах не с одним именем, а с разными, то есть, ты однозначно знаешь, какое поле пишется, вот и вызывай SizeOf для него, а не для структуры в целом.

Для чего-то другого? Тогда расскажи для чего...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Для записи в файл.
Пишется вся структура (причём первое поле у неё - размер) блоком, при чтении же читается сначала размер, а потом столько байт, сколько нужно. Это для того, чтобы при будущем наращивании структуры париться по минимуму.
Писать руками каждое поле и переписывать загрузку/сохранение при каждом изменении, с кучей ветвлений на случай совместимости со старыми версиями? Не надо, я пробовал, мне не понравилось.
Вбивание размера в лоб, набором констант в зависимости от выбора варианта, проще, чем писать в файл поля по одному.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


В общем выкрутился так:


type
A = record
Size: integer;
case B: boolean of
true: (t: integer; tLast: integer;);
false: (f: array [0 .. 9999] of integer; fLast: integer;);
end;
...
case B of
True: size := integer(@A) - integer(@A.tLast);
False: size := integer(@A) - integer(@A.fLast);
end;




Пришлось специальное "ненужное" поле добавлять.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 14:48
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name