1

私はいくつかのオーディオ処理を行っているため、C と Objective C を混合しています。OpenAL インターフェイスとオーディオ処理を処理するクラスをセットアップしました。クラスサフィックスをに変更しました

。んん

...オンラインの多くの例の中で Core Audio ブックで説明されているように。

.h ファイルで宣言され、.mm ファイルで実装された C スタイルの関数があります。

static void granularizeWithData(float *inBuffer, unsigned long int total) {

    // create grains of audio data from a buffer read in using ExtAudioFileRead() method.

    // total value is: 235377
    float tmpArr[total];

    // now I try to zero pad a new buffer:
    for (int j = 1; j <= 100; j++) {
        tmpArr[j] = 0;
        // CRASH on first iteration EXC_BAD_ACCESS (code=1, address= ...blahblah)
    }
}

変???はい、なぜそれが機能しないのかについてはまったく考えていませんが、次のように機能します。

    float tmpArr[235377];

    for (int j = 1; j <= 100; j++) {
        tmpArr[j] = 0;
        // This works and index 0 - 99 are filled with zeros
    }

int 値を持つ「total」サイズの配列を宣言できない理由について、誰も手がかりを持っていますか? 私のプロジェクトでは ARC を使用していますが、これが問題を引き起こす理由がわかりません。デバッグ時に「合計」の値を出力すると、実際には正しい値です。誰かがアイデアを持っている場合は、助けてください、それは私を夢中にさせています!

4

1 に答える 1

6

問題は、その配列がヒープではなくスタックに割り当てられることです。235377*sizeof(float)スタック サイズが制限されているため、バイト配列を割り当てることができません。大きすぎます。代わりにヒープを使用します。

float *tmpArray = NULL;

tmpArray = (float *) calloc(total, sizeof(float)); // allocate it

// test that you actually got the memory you asked for

if (tmpArray)
{
  // use it

  free(tmpArray); // release it
}

ヒープに割り当てられたメモリを解放する責任は常にあることに注意してください。そうしないと、リークが発生します。

2番目の例では、サイズがアプリオリにわかっているため、コンパイラーはそのスペースをプログラムの静的スペースのどこかに予約し、それを機能させます。しかし、最初の例では、その場で実行する必要があるため、エラーが発生します。ただし、いずれにしても、2 番目の例が機能することを確認する前に、配列の最初の 100 要素だけでなく、すべての要素にアクセスしてみる必要があります。

于 2012-11-22T00:26:03.137 に答える