| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Записи |
| Автор: Marlin 15.9.2005, 09:10 | ||||||||
| Довольно стыдно задавать такой вопрос, но лучше спросить чем быть в неведении. Чем отличается такой вид записи:
От такого вида:
Меня интересует "case Integer of" зачем мне выбор значения в структуре? Допустим мне нужно передать указатель на структуру данных, которую я заполнил, ведь я ничего не выбирал не указывал никакого значения. И еще вопрос? Запись:
А теперь запись
В данном случае меня интересует служебное слово Packed (Упакованный). Для чего его нужно писать? В книгах ничего об этом не говориться, Растолкуйте пожалуйста. |
| Автор: ~FoX~ 15.9.2005, 09:22 | ||||
Добавлено @ 09:27
Кажись перечелсяемы тип просто. |
| Автор: Snowy 15.9.2005, 10:43 | ||||
В случае case память на все записи одна, просто доступ к ней может осуществляться, как к разным полям. То есть, записывая в третье поле - меняются первые два. Во втором случае каждое поле имеет свою собственную память.
По умолчанию компилятор оптимизирует запись в памяти для наиболее быстрого доступа к полям. Но, если мы хотим создать точную структуру, без оптимизации, то нужно использовать слово packed, чтобы компилятор собрал запись строго так, как мы ему указали, без выравнивания. |
| Автор: StayAtHome 15.9.2005, 11:03 | ||||||||
Запись с case (вариантная запись) используется в типе Rect (реализация прямоугольника в Delphi). Там хорошо видно, для чего она может быть нужна:
Т. е. можно обращатся и к X,Y-координатам как
Довольно остроумно, ИМХО. |
| Автор: Петрович 15.9.2005, 11:10 | ||||||||||
| По поводу packed. Испльзуется если описываемая запись отражает какую-либо внешнюю структуру. Если оно указано, то поля располагаются в памяти плотно. Размер такой записи равен сумме размеров каждого поля. Если-же packed не указано, то между полями могут быть добавлены лишние (не используемые) байты, предназначенные для выравнивания отдельных полей на границу машинного слова. Это для ускорения доступа к ним. Например, структура:
А структура:
Зато обращение к MyRecord2.Pole1 будет требовать немножко больше времени. Хотя, для современных процессоров, эта разница может быть несущественной, либо вообще отсутствовать. Теперь, вкратце о case в record'ах. Такая конструкция называется вариантной записью. Используется тогда, когда один и тот-же record предназначен для размещения данных либо одного, либо другого типа. Например:
Эта запись может хранить либо фамилию, либо имя персонажа. Что именно в ней хранится в данный момент, определяется значением поля NameType. Это классическое применение вариантной записи. Есть еще одно применение, используемое для обхода механизма жесткой проверки типов. Оно как раз самое частое. В твоем примере:
где:
переменная типа in_addr занимает 4 байта (dword). Но, можно обратиться например к младшему слову как v.SunW[2], или к старшему байту как v.SunB[3]. Более подробно, можно прочитать в книжках. |
| Автор: Romikgy 15.9.2005, 13:37 | ||
аналог сишного union !!! |