2010-04-27 89 views
2

我正在使用二進制文件結構。讀取數據的代碼示例是C語言,我需要在Delphi中讀取它。我急於補充,我沒有C編程經驗。將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] ];將返回第一偏移陣列項目從價值由HdrPtr指向的HeaderType結構?那麼相當於HdrPtr^.Offset[0]

然後&RcvBuff [ HdrPtr->Offset[0] ];應該返回包含RcvBuff數組項索引的值的內存地址,所以相當於@RecBuff[HdrPtr^.Offset[0]]

然後我迷路了(FixLeaderType *)..。有人可以幫忙解釋一下FldrPtr引用的內容嗎?

回答

4

是相關的是的碼位

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 *)將該類型轉換爲有效。這被稱爲演員操作。
+0

謝謝!類型轉換操作是我錯過的那一點。這足以讓我繼續下去。乾杯。 – HMcG 2010-04-27 14:27:24

3

我想你應該讀那些喜歡:

* = pointer to 

& = address of 

,使事情更容易

+0

+1對此非常明確的解釋 – 2010-04-27 14:58:22