【问题标题】:Translating C pointer code example to Delphi pointer syntax将 C 指针代码示例转换为 Delphi 指针语法
【发布时间】:2023-04-06 04:37:01
【问题描述】:

我正在使用二进制文件结构。读取数据的代码示例是C语言的,我需要在Delphi中读取。我赶紧补充一下,我没有C编程经验。

鉴于以下

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 结构中的第一个 Offset 数组项的值?所以相当于HdrPtr^.Offset[0]

那么&RcvBuff [ HdrPtr->Offset[0] ]; 应该返回包含索引的RcvBuff 数组项的值的内存地址,所以相当于@RecBuff[HdrPtr^.Offset[0]]

然后我迷路了 (FixLeaderType *).. 。有人可以帮忙解释一下 FldrPtr 引用了什么吗?

【问题讨论】:

    标签: c delphi pointers translate


    【解决方案1】:

    我认为您应该阅读以下内容:

    * = pointer to
    
    & = address of
    

    这让事情变得更容易

    【讨论】:

      【解决方案2】:

      相关的代码是

      FixLeaderType *FLdrPtr; 
      unsigned char RcvBuff[8192]; 
      
      FLdrPtr = (FixLeaderType *)&RcvBuff [ HdrPtr->Offset[0] ]; 
      
      1. FldPtr 的类型为 FixLeaderType *,或指向 FixLeaderType 的指针。
      2. RcvBuffchar 的数组。
      3. HdrPtr->Offset[0] 解析为一个 ushort 值,因此 RcvBuff [ HdrPtr->Offset[0] ] 产生一个 char 值。
      4. & 表示返回值的地址而不是获取char 的值。请注意,这意味着它的类型为 char *
      5. char * 类型是分配给FldPtr 的错误类型。 (FixLeaderType *) 转换类型以使其有效。这称为强制转换操作。

      【讨论】:

      • 谢谢!类型转换操作是我缺少的一点。这足以让我继续。干杯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2016-08-24
      • 1970-01-01
      • 2012-11-21
      相关资源
      最近更新 更多