【问题标题】:Help me translate the C++ code to Delphi [closed]帮我将 C++ 代码翻译成 Delphi [关闭]
【发布时间】:2010-10-29 08:32:05
【问题描述】:

我在 memset 和 memcpy 中遇到了困难。有人可以为我翻译这个,或者建议这个东西是如何工作的吗?

do{
  memset(szSpeechBuf, 0x0, sizeof(char)*QSIZE);
  if((nBufIter+1)*QSIZE > nRawBufLen)
    {
      diff = nRawBufLen - (nBufIter)*QSIZE;

      if(diff < 0)
      {
        printf("DetectSpeech() error : timeout!!!");
        exit(1);
      }
      memcpy(szSpeechBuf, szRawBuf+(QSIZE*nBufIter), diff);
    }
  else
    memcpy(szSpeechBuf, szRawBuf+(QSIZE*nBufIter), sizeof(char)*QSIZE);
} while(1);

// where szSpeechBuf: PAnsiChar; nBufIter: Integer; Const QSIZE = 3200

【问题讨论】:

  • -1:这不是 help-me,这是 do-it-for-me。向我们展示您尝试过的方法以及哪些特定部分不适合您。
  • 提供您目前拥有的示例代码,然后告诉我们您遇到的问题。当 Space_C0wb0y 说“这是一个 do-it-for-me”时,他的意思是 Stack Overflow 不是为了这个目的。这是为了帮助,而不是为了无偿工作。
  • @Merlyn Morgan-Graham,我在这里找到了daniweb.com/forums/thread238270.html,关于 memset 和 memcpy。它不工作。它们有不同的参数(memcpy)。
  • @Merlyn Morgan-Graham,好的,很抱歉“这是一个 *do-it-for-me”,您对替换“memset 和 memcpy”有什么建议吗?

标签: c++ delphi transactions equivalent


【解决方案1】:
  • memset 用指定的值填充多个字节。在 Delphi 中,我们为此使用FillChar。但是如果我们要填充的值为零,也可以使用ZeroMemory函数。

  • memcpy 将一个字节块从一个位置复制到另一个位置(在 RAM 中)。在 Delphi 中,我们为此使用Move。如果您想使用指针而不是 Delphi 变量,也可以使用 CopyMemory(或 identical 函数 MoveMemory)。

也就是说,

Move(a, b, n)

从名为 a 的数据复制 n 个字节到 b 的位置,其中 a 和 b 是变量。这相当于

CopyMemory(@b, @a, n)

其中@a 和@b 分别是指向源和目标的指针。 (就个人而言,我认为后一种语法在某种意义上更容易解释。它需要两个地址,毕竟这就是我们使用内存的方式。)

因此,如果 pq 是指针,你可以这样做

CopyMemory(q, p, n)

Move(p^, q^, n).

您可能还想知道如何在 Delphi 中分配、重新分配和释放堆上的内存。您分别使用GetMemReallocMemFreeMem 过程。

使用指针

当涉及到指针算术时,Deplhi 可能会受到相当大的限制。但在 32 位系统上(例如运行 Delphi 应用程序的系统),指针实际上只是一个 32 位无符号整数,即cardinal。所以你可以像使用基数一样使用指针,只要你告诉编译器这样做。

因此,如果编译器不允许

myPtr + 200

那你就可以了

cardinal(myPtr) + 200.

【讨论】:

  • 感谢您的回复,但是如何将“szRawBuf+(QSIZEnBufIter)”放入此参数?它说第二个参数是一个指针。 'szRawBuf + (QSIZEnBufIter)' 怎么可能?
  • 好的,我明白了。 move(..) 是不可能的,但 CopyMemory(..) 可以。谢谢
  • @XBasic3000:如果CopyMemory(a, b, n) 有效,那么Move(b^, a^, n) 也有效。 (但也许你需要像 Move(PSomeType(b)^, PSomeType(a)^, n 一样投射它。)
  • 为什么要投反对票?请详细说明。
  • @XBasic3000:很高兴你得到了你需要的帮助。你能发布你最终得到的代码吗?
【解决方案2】:

经过几天的代码试验,我终于成功了!

@Merlyn Morgan-Graham 让我发布答案,然后这个问题就解决了!他们说这不是真的?因为是我自己回答的?

【讨论】:

  • 不,看起来不错。很高兴你让它工作:)
  • +1 并投票支持重新开放;我同意这是一个关于从 C/C++ 翻译到 Delphi 的真正问题。
  • @Jeroen Pluimers,谢谢。给你更多的力量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多