2

我在 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
4

2 回答 2

4
  • memset用指定的值填充多个字节。在 Delphi 中,我们使用FillChar它。但是如果我们要填充的值为零,也可以使用该ZeroMemory函数。

  • memcpy将一个字节块从一个位置复制到另一个位置(在 RAM 中)。在 Delphi 中,我们使用Move它。如果您想使用指针而不是 Delphi 变量,也可以使用CopyMemory(或相同的函数)。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.
于 2010-10-29T08:51:38.803 回答
1

经过几天的代码试验,我终于让它工作了!

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

于 2010-10-30T23:43:48.623 回答