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
答案 0 :(得分: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分别是指向源和目标的指针。 (就我个人而言,我认为后一种语法在某种意义上更容易解释。它需要两个地址,毕竟,这就是我们处理内存的方式。)
因此,如果p
和q
是指针,则可以执行
CopyMemory(q, p, n)
或
Move(p^, q^, n).
您可能还想知道如何在Delphi中分配,重新分配和释放堆上的内存。您分别使用GetMem
,ReallocMem
和FreeMem
程序。
Deplhi在指针算术方面可能相当严格。但是在32位系统(例如运行Delphi应用程序的系统)上,指针实际上只是一个32位无符号整数,即cardinal
。因此,如果您只是告诉编译器这样做,您可以使用与基数类似的指针。
因此,如果编译器不允许
myPtr + 200
然后你可以做
cardinal(myPtr) + 200.
答案 1 :(得分:1)