2012-07-22 5 views
0

1 또는 2 값에 따라 1 차원 배열 또는 2 차원 배열을 동적으로 할당하는 방법은 무엇입니까?동적으로 1 또는 2 차원 float ** 할당

이 배열은 frameCount 수의 float을 보유해야하지만 1 또는 2 채널로 나뉩니다. 첫 번째 차원은 채널 수이고 두 번째 차원은 프레임 수입니다. 2 개의 채널이있는 경우 frameCount은 [channelNumber] [frameNumber]와 같은 2 차원으로 나뉩니다.

다음 코드가 있지만 작동하지 않는다고 생각합니다. 내 배열 디버거에서 다음과 같습니다

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

enter image description here 내가

- (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

2 차원 배열이란 무엇입니까? 대개'R * C' 엘리먼트의 벡터이고, 당신은 명시 적으로't [i * R + j]'에 접근합니다. 때로는 (예를 들어, 행의 길이가 변할 때) 어레이 포인터 배열을 선호하므로't [i] [j]' –

+0

배열 [channelNumber] [frameNumber]로 액세스하려했으나 배열에 접근하지 못했습니다. 데이터로 채워지면 잘못 배치 된 것 같습니다. – user773578

+0

아니요,'array [channelNumber] [frameNumber]'를 사용하면 배열에 대한 포인터의 배열이있을 때 의미가 있습니다. 할당에 대한 문제가 아니라 요소 액세스에 대한 질문입니다. –

답변

2
다음과 같이 함께 배열을 채울 수 있도록 함수에 부동 **를 전달해야

malloc 문이 올 바르지 만 형식이 잘못되었습니다. Malloc은 주소 (즉, 포인터)를 반환하며 그 주소에있는 것은 일련의 수레 중 첫 번째 것이다. 즉, float에 대한 포인터를 반환합니다.

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

을하지만 이것은 단지 추측이다 : 당신이 정말로 포인터 포인터를해야하는 경우

은 그때는 아마 이런 식의 malloc 할 필요가

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

을 시도합니다. 이라고하는 기능은에 무엇을 전달해야하는지 명확해야합니다.

+0

이것을 float **로 채우는 함수에 이것을 어떻게 전달할 것인가? 일단 끝나면 이러한 값을 기록하는 방법을 확신 할 수 없다. . – user773578

+0

'float **'를 원한다면 2 차원 배열이 아니고 배열에 ** 포인터 ** 배열을 가지므로 포인터 배열의 각 포인터 요소를 개별적으로 할당해야합니다. –

+0

이것은 함수가 배열을 float의 간단한 정사각형 격자가 아닌 다른 구조로 만들기를 원한다는 것을 나타내는 경향이 있습니다. 대부분의 경우 채널 포인터의 배열을 기대하며 각각은 별도의 플로트 배열을 가리 킵니다. float 포인터의 배열을 채널 당 하나씩 malloc해야하고 각 채널에 대해 해당 채널의 프레임을 malloc 한 결과에 해당 항목을 설정해야합니다. – swestrup

관련 문제