![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос по синтаксису Object Pascal [D5, D7, Win2k, WinXP]
Arm79 © (2005-01-17 19:26:00)Уважаемые мастера. Я тут в чужой программе наткнулся на следующий участок кода.
type
PMTEMsg = ^TMTEMsg;
TMTEMsg = record
DataLen : Integer;
Data : record end;
end;
Объясните мне пожалуйста, для чего может использоваться такое объявление типа как record end; ?
palva (2005-01-18 18:44:00) [1]Кстати,
Jel © (17.01.05 21:36) [7]
> Можно еще
> Array [0..0] of byte;
Здесь будет длина 1, а не 0. :-)
Arm79 (2005-01-18 17:57:00) [2]Спасибо. Стало более менее понятно.
Verg (2005-01-17 21:53:00) [3]
> Можно еще
>
> Array [0..0] of byte;
>
> Хотя, это привязывает объявление к типу.
Это тоже будет иметь sizeof = +1. Что, опять же, не соответсвует чистому заголовкунекоей структуры с полем длиной 0...DataLen.
И еще, там надо бы добавить packed для определенности.
Jel (2005-01-17 21:36:00) [4]
> record end; - это пожалуй единственный способ объявить существующее
> поле неизвестной длины, декларирируя заголовок такой структуры.
Можно еще
Array [0..0] of byte;
Хотя, это привязывает объявление к типу.
Verg (2005-01-17 21:23:00) [5]
> TMTEMsg
В данном случае TMTEMsg было бы справедливее и логичнее назвать TMTEMsg Header. При этом мы имеем абсолютно легалный доступ к полю Data и в то же время абсолютно оправданный sizeof(TMTEMsgHeader), в отличии от
> Хотя, конечно, data может бвть объявлена и как байт, char
> и т.п.
Тут он ( sizof) будет на единицу ( sizeof( байт, char и т.п.)) больше...
record end; - это пожалуй единственный способ объявить существующее поле неизвестной длины, декларирируя заголовок такой структуры.
Kerk (2005-01-17 21:13:00) [6]palva © (17.01.05 21:10) [4]
Не подходит. Здесь, как я понял, хотят указать переменную типа, занимающего 0 байтов.
а смысл?
palva (2005-01-17 21:10:00) [7]Arm79 © (17.01.05 19:46) [2]
> А что, Pointer для этих целей уже не пожходит:
Не подходит. Здесь, как я понял, хотят указать переменную типа, занимающего 0 байтов.
PVOzerski (2005-01-17 19:54:00) [8]Ну, можешь через адресный оператор получить и адрес data в виде pointer. Просто это разная организация хранения данных в памяти. Если ты "накладываешь шаблон" PMTEMMsg на структуру, в которой линейно расположены информация о ее длине и блок байт, ты получишь адекватный результат. Хотя, конечно, data может бвть объявлена и как байт, char и т.п.
Arm79 (2005-01-17 19:46:00) [9]А что, Pointer для этих целей уже не пожходит:
PVOzerski (2005-01-17 19:30:00) [10]Например, чтобы потом преобразовать к другому типу. Или передать как нетипизированный параметр в функцию.