Главная страница
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.052 c
1-1106219590
FUNdaMental
2005-01-20 14:13
2005.01.30
Вызов ВОРДА


1-1105390312
vertal
2005-01-10 23:51
2005.01.30
Возбуждение исключения в другом потоке


3-1103801711
}|{yk
2004-12-23 14:35
2005.01.30
Где ошибка в триггере?


4-1102701514
Matrex
2004-12-10 20:58
2005.01.30
Cвойства файла в стандартном окне Windows, закладки


11-1087067965
Андрей2
2004-06-12 23:19
2005.01.30
Не происходит переключение между формами