Перевод примера кода указателя C в синтаксис указателя Delphi - PullRequest
2 голосов
/ 27 апреля 2010

Я работаю с бинарной файловой структурой.Пример кода для чтения данных написан на C, и мне нужно прочитать его на Delphi.Спешу добавить, что у меня нет опыта программирования на Си.

Учитывая следующее

typedef struct {
uchar ID, DataSource;
ushort ChecksumOffset;
uchar Spare, NDataTypes;
ushort Offset [256];
} HeaderType; 

...

typedef struct {
ushort ID;
...
ushort DistanceToBin1Middle,TransmitLength;
} FixLeaderType;

...

HeaderType *HdrPtr;
FixLeaderType *FLdrPtr;

unsigned char RcvBuff[8192];
void DecodeBBensemble( void )
{
unsigned short i, *IDptr, ID;
FLdrPtr = (FixLeaderType *)&RcvBuff [ HdrPtr->Offset[0] ];
if (FLdrPtr->NBins > 128)
FLdrPtr->NBins = 32;

...

Бит, с которым я сталкиваюсь, заключается в следующем:

FLdrPtr = (FixLeaderType *)&RcvBuff [ HdrPtr->Offset[0] ];

ИзЯ мало понимаю, [ HdrPtr->Offset[0] ]; будет возвращать значение первого элемента массива Offset из структуры HeaderType, на которую указывает HdrPtr?Таким образом, эквивалентно HdrPtr^.Offset[0]?

Тогда &RcvBuff [ HdrPtr->Offset[0] ]; должен возвращать адрес памяти, содержащий индексированное значение элемента массива RcvBuff, поэтому эквивалентно @RecBuff[HdrPtr^.Offset[0]]?

Тогда я теряюсьс (FixLeaderType *)...Может кто-нибудь помочь объяснить, на что конкретно ссылается FldrPtr?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2010

Соответствующие биты кода:

FixLeaderType *FLdrPtr; 
unsigned char RcvBuff[8192]; 

FLdrPtr = (FixLeaderType *)&RcvBuff [ HdrPtr->Offset[0] ]; 
  1. FldPtr имеет тип FixLeaderType * или указатель на FixLeaderType.
  2. RcvBuff - это массив char.
  3. HdrPtr->Offset[0] преобразуется в значение ushort, поэтому RcvBuff [ HdrPtr->Offset[0] ] дает значение char.
  4. & означает, что вместо получения значения char возвращается адрес значения. Обратите внимание, что это означает, что он имеет тип char *.
  5. Тип char * - это неправильный тип, назначаемый на FldPtr. (FixLeaderType *) преобразует тип так, чтобы он был действительным. Это называется операцией приведения.
3 голосов
/ 27 апреля 2010

Я думаю, вы должны прочитать такие как:

* = pointer to

& = address of

что делает вещи намного проще

...