Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

вопрос по синтаксису Object Pascal   Найти похожие ветки 

 
Arm79 ©   (2005-01-17 19:26) [0]

Уважаемые мастера. Я тут в чужой программе наткнулся на следующий участок кода.
type
 PMTEMsg   = ^TMTEMsg;
 TMTEMsg   = record
   DataLen : Integer;
   Data    : record end;
 end;
Объясните мне пожалуйста, для чего может использоваться такое объявление типа как record end; ?


 
PVOzerski ©   (2005-01-17 19:30) [1]

Например, чтобы потом преобразовать к другому типу. Или передать как нетипизированный параметр в функцию.


 
Arm79 ©   (2005-01-17 19:46) [2]

А что, Pointer для этих целей уже не пожходит:


 
PVOzerski ©   (2005-01-17 19:54) [3]

Ну, можешь через адресный оператор получить и адрес data в виде pointer. Просто это разная организация хранения данных в памяти. Если ты "накладываешь шаблон" PMTEMMsg на структуру, в которой линейно расположены информация о ее длине и блок байт, ты получишь адекватный результат. Хотя, конечно, data может бвть объявлена и как байт, char и т.п.


 
palva ©   (2005-01-17 21:10) [4]

Arm79 ©   (17.01.05 19:46) [2]
> А что, Pointer для этих целей уже не пожходит:
Не подходит. Здесь, как я понял, хотят указать переменную типа, занимающего 0 байтов.


 
Kerk ©   (2005-01-17 21:13) [5]

palva ©   (17.01.05 21:10) [4]
Не подходит. Здесь, как я понял, хотят указать переменную типа, занимающего 0 байтов.

а смысл?


 
Verg ©   (2005-01-17 21:23) [6]


> TMTEMsg  


В данном случае TMTEMsg было бы справедливее и логичнее назвать TMTEMsgHeader. При этом мы имеем абсолютно легалный доступ к полю Data и в то же время абсолютно оправданный sizeof(TMTEMsgHeader), в отличии от

> Хотя, конечно, data может бвть объявлена и как байт, char
> и т.п.


Тут он ( sizof) будет на единицу ( sizeof( байт, char и т.п.)) больше...

record end; - это пожалуй единственный способ объявить существующее поле неизвестной длины, декларирируя заголовок такой структуры.


 
Jel ©   (2005-01-17 21:36) [7]


> record end; - это пожалуй единственный способ объявить существующее
> поле неизвестной длины, декларирируя заголовок такой структуры.


Можно еще

Array [0..0] of byte;

Хотя, это привязывает объявление к типу.


 
Verg ©   (2005-01-17 21:53) [8]


> Можно еще
>
> Array [0..0] of byte;
>
> Хотя, это привязывает объявление к типу.


Это тоже будет иметь sizeof = +1. Что, опять же, не соответсвует чистому заголовку некоей структуры с полем длиной 0...DataLen.

И еще, там надо бы добавить packed для определенности.


 
Arm79 ©   (2005-01-18 17:57) [9]

Спасибо. Стало более менее понятно.


 
palva ©   (2005-01-18 18:44) [10]

Кстати,

Jel ©   (17.01.05 21:36) [7]
> Можно еще
> Array [0..0] of byte;

Здесь будет длина 1, а не 0. :-)



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.054 c
3-1104302393
DimaK
2004-12-29 09:39
2005.01.30
Вопрос в IBX...


1-1105653572
Alex_S
2005-01-14 00:59
2005.01.30
Label.Caption запаздывает


1-1106053344
Knoxville
2005-01-18 16:02
2005.01.30
Как узнать какой элемент выбран в TListBox?


3-1103720485
}|{yk
2004-12-22 16:01
2005.01.30
Юзеры и работники


6-1100608428
slaga
2004-11-16 15:33
2005.01.30
Полный путь в другой домен ?