Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
3-1103862206
Nexel
2004-12-24 07:23
2005.01.30
Ну вот и грабли с IBX


6-1100647101
Kot Vaska
2004-11-17 02:18
2005.01.30
Передача пользователя и пароля


14-1105514038
santa
2005-01-12 10:13
2005.01.30
PageControl


1-1106190570
Guest00
2005-01-20 06:09
2005.01.30
выделение в comboBox


6-1100231043
Lingo
2004-11-12 06:44
2005.01.30
Password never Expired





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский