Главная страница
    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.035 c
4-1102923618
denis24
2004-12-13 10:40
2005.01.30
запуск второй копии програмы из faq


14-1105636003
Chuvak
2005-01-13 20:06
2005.01.30
Logo for Win


1-1106212666
Nad89
2005-01-20 12:17
2005.01.30
SubItem в TreeView


11-1088631285
Vladimyr
2004-07-01 01:34
2005.01.30
SysDcu 7 - где же эти 5 кБ ?


10-1082532514
DinoRay
2004-04-21 11:28
2005.01.30
События ActiveX





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский