在C ++中使用一些C代码并获得Access冲突错误

问题描述 投票:0回答:2

我正在尝试使用C ++ Builder社区版中sflowtool.c的以下代码,但收到访问冲突。

uint32_t TForm3::getData32_nobswap(SFSample *sample)
{
    uint32_t ans = *(sample->datap)++; // HERE I GET THE ERROR

  if((uint8_t *)sample->datap > sample->endp) {
    SFABORT(sample, SF_ABORT_EOS);
  }
  return ans;

在&sample传递到上述函数之前,它具有此

    SFSample sample;
    memset(&sample, 0, sizeof(sample))
    sample.rawSample = (uint8_t *) AData[0];
    sample.datap = (uint32_t *) sample.rawSample;
    sample.endp = (uint8_t *) sample.rawSample + sample.rawSampleLen;
    sample.datagramVersion = getData32(&sample);

有人可以给我一些指示以了解原因吗?与C相比,C ++处理上述代码是否有任何区别?

c++ c++builder
2个回答
1
投票

您打算这样做:

sample.rawSample = (uint8_t *) &AData[0];

注意附加的&。这意味着您将rawSample设置为AData数组中第一个元素的地址,而不是将AData视为指针数组并从中获取第一个指针。


0
投票

感谢@Michael Beer和@PaulMcKenzie的评论,它们足以让我意识到问题是“ const TIdBytes AData”。作为一种快速的解决方案,我可以通过将TIDBytes []转换为char []并进一步使用char []来达到目标​​,效果很好

  char buf[AData.Length];
  for(int i=0;i<AData.Length;i++)
  {
      buf[i] = AData[i];
  }
  memset(&sample, 0, sizeof(sample));
  sample.rawSample = (uint8_t *) buf;

另一个“ Delphi方式”也是可行的

  char buf[AData.Length];
  BytesToRaw(AData,buf,AData.Length);

感谢您的支持

© www.soinside.com 2019 - 2024. All rights reserved.