2

memsetとmemcpyで苦労しているim。誰かが私のためにこれを翻訳することができますか、またはこれがどのように機能するかについての提案はありますか?

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 という名前のデータから b の場所に n バイトをコピーします。ここで、a と b は変数です。これは、

CopyMemory(@b, @a, n)

@a と @b は、それぞれソースと宛先へのポインターです。(個人的には、ある意味では後者の構文の方が説明しやすいと思います。これには 2 つのaddressが必要です。結局のところ、それがメモリの扱い方です。)

したがって、pqがポインターの場合、次のことができます。

CopyMemory(q, p, n)

また

Move(p^, q^, n).

また、Delphi のヒープでメモリを割り当て、再割り当て、および解放する方法を知りたい場合もあります。GetMemReallocMem、およびFreeMem手順をそれぞれ使用します。

ポインターの操作

ポインター演算に関しては、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 に答える