![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Marlin |
|
||||||||
|
Unregistered |
Довольно стыдно задавать такой вопрос, но лучше спросить чем быть в неведении.
Чем отличается такой вид записи:
От такого вида:
Меня интересует "case Integer of" зачем мне выбор значения в структуре? Допустим мне нужно передать указатель на структуру данных, которую я заполнил, ведь я ничего не выбирал не указывал никакого значения. И еще вопрос? Запись:
А теперь запись
В данном случае меня интересует служебное слово Packed (Упакованный). Для чего его нужно писать? В книгах ничего об этом не говориться, Растолкуйте пожалуйста. Это сообщение отредактировал(а) Girder - 15.9.2005, 09:41 |
||||||||
|
|||||||||
| ~FoX~ |
|
||||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: 13 Всего: 68 |
Добавлено @ 09:27
Кажись перечелсяемы тип просто. |
||||
|
|||||
| Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
В случае case память на все записи одна, просто доступ к ней может осуществляться, как к разным полям. То есть, записывая в третье поле - меняются первые два. Во втором случае каждое поле имеет свою собственную память.
По умолчанию компилятор оптимизирует запись в памяти для наиболее быстрого доступа к полям. Но, если мы хотим создать точную структуру, без оптимизации, то нужно использовать слово packed, чтобы компилятор собрал запись строго так, как мы ему указали, без выравнивания. |
||||
|
|||||
| StayAtHome |
|
||||||||
![]() Домосед ![]() ![]() Профиль Группа: Участник Сообщений: 456 Регистрация: 26.1.2004 Где: Украина Репутация: 1 Всего: 16 |
Запись с case (вариантная запись) используется в типе Rect (реализация прямоугольника в Delphi). Там хорошо видно, для чего она может быть нужна:
Т. е. можно обращатся и к X,Y-координатам как
Довольно остроумно, ИМХО. |
||||||||
|
|||||||||
| Петрович |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
По поводу packed.
Испльзуется если описываемая запись отражает какую-либо внешнюю структуру. Если оно указано, то поля располагаются в памяти плотно. Размер такой записи равен сумме размеров каждого поля. Если-же packed не указано, то между полями могут быть добавлены лишние (не используемые) байты, предназначенные для выравнивания отдельных полей на границу машинного слова. Это для ускорения доступа к ним. Например, структура:
А структура:
Зато обращение к MyRecord2.Pole1 будет требовать немножко больше времени. Хотя, для современных процессоров, эта разница может быть несущественной, либо вообще отсутствовать. Теперь, вкратце о case в record'ах. Такая конструкция называется вариантной записью. Используется тогда, когда один и тот-же record предназначен для размещения данных либо одного, либо другого типа. Например:
Эта запись может хранить либо фамилию, либо имя персонажа. Что именно в ней хранится в данный момент, определяется значением поля NameType. Это классическое применение вариантной записи. Есть еще одно применение, используемое для обхода механизма жесткой проверки типов. Оно как раз самое частое. В твоем примере:
где:
переменная типа in_addr занимает 4 байта (dword). Но, можно обратиться например к младшему слову как v.SunW[2], или к старшему байту как v.SunB[3]. Более подробно, можно прочитать в книжках. -------------------- Все знать невозможно, но хочется |
||||||||||
|
|||||||||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
аналог сишного union !!! -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |