1 또는 2 값에 따라 1 차원 배열 또는 2 차원 배열을 동적으로 할당하는 방법은 무엇입니까?동적으로 1 또는 2 차원 float ** 할당
이 배열은 frameCount
수의 float을 보유해야하지만 1 또는 2 채널로 나뉩니다. 첫 번째 차원은 채널 수이고 두 번째 차원은 프레임 수입니다. 2 개의 채널이있는 경우 frameCount
은 [channelNumber] [frameNumber]와 같은 2 차원으로 나뉩니다.
다음 코드가 있지만 작동하지 않는다고 생각합니다. 내 배열 디버거에서 다음과 같습니다
float ** arrayToFill = (float **)malloc((frameCount*channelCount)*sizeof(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;
}
2 차원 배열이란 무엇입니까? 대개'R * C' 엘리먼트의 벡터이고, 당신은 명시 적으로't [i * R + j]'에 접근합니다. 때로는 (예를 들어, 행의 길이가 변할 때) 어레이 포인터 배열을 선호하므로't [i] [j]' –
배열 [channelNumber] [frameNumber]로 액세스하려했으나 배열에 접근하지 못했습니다. 데이터로 채워지면 잘못 배치 된 것 같습니다. – user773578
아니요,'array [channelNumber] [frameNumber]'를 사용하면 배열에 대한 포인터의 배열이있을 때 의미가 있습니다. 할당에 대한 문제가 아니라 요소 액세스에 대한 질문입니다. –