0

値 1 または 2 に応じて、1 次元配列または 2 次元配列を動的に割り当てるにはどうすればよいでしょうか?

この配列はframeCount多数の float を保持する必要がありますが、1 つまたは 2 つのチャネルに分割されます。最初の次元はチャネル数で、2 番目の次元はフレーム数です。2 つのチャネルがある場合、frameCount[channelNumber] [frameNumber] のように 2 つの次元に分割されます。

次のコードがありますが、機能しているとは思いません。

float ** arrayToFill = (float **)malloc((frameCount*channelCount)*sizeof(float));

私の配列はデバッガーでこのように見えます

ここに画像の説明を入力

次のように配列を埋めることができるように、float ** を関数に渡す必要があります

- (OSStatus) readFloatsConsecutive:(SInt64)numFrames intoArray:(float**)audio withOffset:(long)offset
{
OSStatus err = noErr;

if (!mExtAFRef) return -1;

int kSegmentSize = (int)(numFrames * mExtAFNumChannels * mExtAFRateRatio + .5);
if (mExtAFRateRatio < 1.) kSegmentSize = (int)(numFrames * mExtAFNumChannels / mExtAFRateRatio + .5);

AudioBufferList bufList;
UInt32 numPackets = numFrames; // Frames to read
UInt32 samples = numPackets * mExtAFNumChannels;
UInt32 loadedPackets = numPackets;


short *data = (short*)malloc(kSegmentSize*sizeof(short));
if (!data) {
    NSLog(@"data is nil");
    goto error;
}


bufList.mNumberBuffers = 1;
bufList.mBuffers[0].mNumberChannels = mExtAFNumChannels;
bufList.mBuffers[0].mData = data; // data is a pointer (short*) to our sample buffer
bufList.mBuffers[0].mDataByteSize = samples * sizeof(short);

@synchronized(self) {
    err = ExtAudioFileRead(mExtAFRef, &loadedPackets, &bufList);
}
if (err) goto error;

if (audio) {
    for (long c = 0; c < mExtAFNumChannels; c++) {
        if (!audio[c]) continue;
        for (long v = 0; v < numFrames; v++) {
            if (v < loadedPackets) audio[c][v+offset] = (float)data[v*mExtAFNumChannels+c] / 32768.f;
            else audio[c][v+offset] = 0.f;
        }
    }
}

error:
free(data);
if (err != noErr) return err;
if (loadedPackets < numFrames) mExtAFReachedEOF = YES;
mRpos += loadedPackets;
return loadedPackets;
 }
4

1 に答える 1

2

malloc ステートメントは正しいですが、タイプが間違っています。Malloc はアドレス (つまりポインター) を返し、そのアドレスにあるものが一連の float の最初のものです。つまり、float へのポインターを返します。

試す

float * arrayToFill = malloc ( (frameCount * channelCount) * sizeof( float ));

本当にポインターポインターが必要な場合は、おそらく次のような malloc が必要です。

float ** arrayToFill = malloc(frameCount * sizeof(float *));
for(i=0;i<frameCount;i++)
  arrayToFill[i] = malloc(channelCount * sizeof(float));

しかし、これは単なる推測です。呼び出す関数は、何を渡すかを明確にする必要があります。

于 2012-07-22T06:03:41.587 に答える