Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Внизвопрос по синтаксису 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c