Определение структуры Delphi

Я наткнулся на это определение структуры в Delphi. Я очень новичок в Delphi. Я просматриваю свой Delphi, пытаясь понять этот код ниже. Я не могу понять, что именно это означает. Было бы здорово, если бы кто-нибудь объяснил.

// MSG
  TPayloadHdr = packed record
    Count: byte;
  end;
  PPayload = ^Payload;
  Payload = packed record
    Hdr: TPayloadHdr;
    TagLen: packed array[0..MAXINT div (2*sizeof(word))] of word;
    // Data: array[0..] of byte;  Use @TagLen[Hdr.Count] to get a pointer to the first structure.  
    function GetSize: integer;
  end;

Вопросы, которые у меня есть.

  1. Почему два end без begin

  2. Что означает ^Payload?

  3. Является ли record ключевым словом? Что это означает?


person liv2hak    schedule 29.11.2015    source источник
comment
Я думаю, вы имеете в виду начало, а не начало и запись, а не запись. Во всяком случае, грамматика Паскаля использует конец в различных контекстах, а не только в парах начало-конец, например. чтобы сигнализировать об окончании определения записи или определения класса. ^Something означает указатель на что-то   -  person MartynA    schedule 29.11.2015
comment
@MartynA - Это определение записи в приведенном выше примере?   -  person liv2hak    schedule 29.11.2015
comment
На самом деле в вашем примере их два: TPayloadHdr и Payload. Запись похожа на структуру в C.   -  person MartynA    schedule 29.11.2015
comment
@liv2hak: Да. Код в вашем примере следует за ключевым словом type.   -  person Andreas Rejbrand    schedule 29.11.2015
comment
Это все задокументировано   -  person David Heffernan    schedule 29.11.2015
comment
На все эти три вопроса можно было бы ответить, используя любой базовый учебник по Delphi.   -  person Jerry Dodge    schedule 30.11.2015


Ответы (1)


  1. Синтаксис для определения записи содержит end без begin.

  2. Если Something является типом, то ^Something также является типом, а именно указатель на Something.

  3. record — это ключевое слово, используемое для определения типов записей.

person Andreas Rejbrand    schedule 29.11.2015
comment
что означает packed array[0..MAXINT div (2*sizeof(word))] of word;? - person liv2hak; 29.11.2015
comment
Это тип. Это массив из words (16-битные целые числа без знака); индексы варьируются от 0 до MAXINT div (2*sizeof(word)), поэтому элементов MAXINT div (2*sizeof(word)) + 1. MAXINT — это наибольшее 32-битное целое число со знаком (2^31 — 1 = 2147483647), sizeof(word) = 2 (поскольку 16 бит — это 2 байта). Массив упакован. - person Andreas Rejbrand; 29.11.2015
comment
@liv2hak Это уловка для определения большого статического массива, чтобы не возникало переполнения. Такой массив не выделен, а просто указатель на буфер слов в памяти. Далее сама структура данных начинается после слов, т.е. at @TagLen[Hdr.Count] - здесь @ означает at, т.е. возвращает указатель на первый элемент структуры. - person Arnaud Bouchez; 29.11.2015
comment
Пакет @Andreas игнорируется в массивах в delphi - person David Heffernan; 29.11.2015
comment
@David: тоже так думал, но был немного смущен документацией, которая подразумевает обратное: docwiki.embarcadero.com/RADStudio/XE8/ru/ - person Andreas Rejbrand; 29.11.2015
comment
Документация странная. packed имеет значение в Delphi только для записей и классов и, предположительно, объектов. - person David Heffernan; 30.11.2015
comment
@DavidHeffernan: Прошу прощения за любопытство, но в чем странность? Конечно, упакованные восходят к эпохе, когда для (TP) баз данных было обычным делом состоять из файлов данных, которые были файлами xxxRecordType, и где требовалось, чтобы упакованный образ памяти был таким же, как для записей файла? - person MartynA; 30.11.2015
comment
@MartynA В Delphi packed array и array взаимозаменяемы - person David Heffernan; 30.11.2015