Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Записи, Разобраться с записями 
:(
    Опции темы
Marlin
Дата 15.9.2005, 09:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Довольно стыдно задавать такой вопрос, но лучше спросить чем быть в неведении.

Чем отличается такой вид записи:


Код

in_addr=record
case Integer of
      0:(S_un_b:SunB);
      1:(S_un_w:SunW);
      2:(S_addr:u_long);
end;
TInAddr=in_addr;


От такого вида:

Код

in_addr=record
   S_un_b:SunB;
   S_un_w:SunW;
   S_addr:u_long;
end;
TInAddr=in_addr;


Меня интересует "case Integer of" зачем мне выбор значения в структуре?
Допустим мне нужно передать указатель на структуру данных, которую я заполнил, ведь я ничего не выбирал не указывал никакого значения.

И еще вопрос?

Запись:

Код

MyRecord = Record
    pole1: integer;  
    Pole2: integer;
    Pole3: integer;
end;


А теперь запись

Код

MyRecord =Packed Record
    pole1: integer;  
    Pole2: integer;
    Pole3: integer;
end;


В данном случае меня интересует служебное слово Packed (Упакованный). Для чего его нужно писать?

В книгах ничего об этом не говориться, Растолкуйте пожалуйста.

Это сообщение отредактировал(а) Girder - 15.9.2005, 09:41
  Вверх
~FoX~
Дата 15.9.2005, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата

By default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage. For example,

type TNumbers = packed array[1..100] of Real;

Using packed slows data access and, in the case of a character array, affects type compatibility

Добавлено @ 09:27
Цитата(Marlin @ 15.9.2005, 10:10)
Меня интересует "case Integer of" зачем мне выбор значения в структуре?

Кажись перечелсяемы тип просто.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Snowy
Дата 15.9.2005, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Marlin @ 15.9.2005, 09:10)
Чем отличается такой вид записи:

В случае case память на все записи одна, просто доступ к ней может осуществляться, как к разным полям.
То есть, записывая в третье поле - меняются первые два.
Во втором случае каждое поле имеет свою собственную память.


Цитата(Marlin @ 15.9.2005, 09:10)
слово Packed (Упакованный). Для чего его нужно писать?

По умолчанию компилятор оптимизирует запись в памяти для наиболее быстрого доступа к полям. Но, если мы хотим создать точную структуру, без оптимизации, то нужно использовать слово packed, чтобы компилятор собрал запись строго так, как мы ему указали, без выравнивания.
PM MAIL   Вверх
StayAtHome
Дата 15.9.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Запись с case (вариантная запись) используется в типе Rect (реализация прямоугольника в Delphi). Там хорошо видно, для чего она может быть нужна:
Код

  TRect = packed record
    case Integer of
      0: (Left, Top, Right, Bottom: Longint);
      1: (TopLeft, BottomRight: TPoint);
  end;

Т. е. можно обращатся и к X,Y-координатам как
Код

aRectangle.Left, Rec.Top
, и сразу к целым углам прямоугольника:
Код

aRectangle.TopLeft
или даже так
Код

aRectangle.TopLeft.X, aRectangle.TopLeft.Y

Довольно остроумно, ИМХО.
PM MAIL WWW ICQ YIM   Вверх
Петрович
Дата 15.9.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



По поводу packed.
Испльзуется если описываемая запись отражает какую-либо внешнюю структуру. Если оно указано, то поля располагаются в памяти плотно. Размер такой записи равен сумме размеров каждого поля. Если-же packed не указано, то между полями могут быть добавлены лишние (не используемые) байты, предназначенные для выравнивания отдельных полей на границу машинного слова. Это для ускорения доступа к ним.
Например, структура:
Код

MyRecord1 = Record
    Pole1: Char;  
    Pole2: integer;
end;
будет занимать в памяти 8 байт.
А структура:
Код

MyRecord2 = packed Record
    Pole1: Char;  
    Pole2: integer;
end;
будет занимать в памяти 5 байт.
Зато обращение к MyRecord2.Pole1 будет требовать немножко больше времени. Хотя, для современных процессоров, эта разница может быть несущественной, либо вообще отсутствовать.

Теперь, вкратце о case в record'ах.

Такая конструкция называется вариантной записью. Используется тогда, когда один и тот-же record предназначен для размещения данных либо одного, либо другого типа.
Например:
Код

tNameType = (ntFirstName,ntLastName);
tPersone = record
  case NameType :tNameType of
    ntFirstName: (FirstName:String);
    ntLastName: (LastName:String);
end;

Эта запись может хранить либо фамилию, либо имя персонажа. Что именно в ней хранится в данный момент, определяется значением поля NameType.
Это классическое применение вариантной записи. Есть еще одно применение, используемое для обхода механизма жесткой проверки типов. Оно как раз самое частое. В твоем примере:
Код

in_addr=record
case Integer of
      0:(S_un_b:SunB);
      1:(S_un_w:SunW);
      2:(S_addr:u_long);
end;

где:
Код

  SunB = array[0..3] of byte;
  SunW = array[0..1] of word;
  u_long = dword;

переменная типа in_addr занимает 4 байта (dword). Но, можно обратиться например к младшему слову как v.SunW[2], или к старшему байту как v.SunB[3].

Более подробно, можно прочитать в книжках. smile




--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Romikgy
Дата 15.9.2005, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата
case Integer of

аналог сишного union !!!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.