Главная страница
    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.031 c
3-1104262713
zokzok
2004-12-28 22:38
2005.01.30
Доступ к таблице из другой формы


1-1106129788
vint45
2005-01-19 13:16
2005.01.30
Проблема с дебагом


4-1102588278
Yuri Btr
2004-12-09 13:31
2005.01.30
Идентификация процесса по Mutex


4-1102611823
Eugene30
2004-12-09 20:03
2005.01.30
SUBST для файлов


3-1104329894
Russko
2004-12-29 17:18
2005.01.30
Ошибка: "Не уникален ключ"





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