기능

2013-07-09 2 views
0

에 2 차원 동적 배열의 한 차원을 전달 그래서기능

accData = calloc(nbox, sizeof(double *)); 
for(bb = 0; bb < nbox; bb++) 
    accData[bb] = calloc(usedTime * usedChan, sizeof(double *)); 

같은 내가 런타임에 동적으로 할당하고있어 2 차원 배열을하고 난 단지 내 함수에 두 번째 차원을 전달하려는. 이 배열은 여러 개의 다른 "상자"에 정의 된 데이터를 나타내며 각 상자마다 관련 정보를 함수에 전달하고 처리하여 동일한 배열에 저장하려고합니다. fftAndSubtract는 FFT (고속 푸리에 변환)과 몇 가지 다른 작업을 수행

for(bb = 0; bb < nbox; bb++) 
    fftAndsubtract(accData[bb], ntime, nchan, nsigma, bb); 

을 - 현재이 내가 그것을하고있어 방법이다. 함수 정의는 그래서 같다 :

int fftAndsubtract(double accData[], ntime, nchan, nsigma, bb); 

을하지만 fftAndSubtract이 생산하는 수정 된 값을 유지하는 accData하지 않는 것 같습니다. 함수 자체에서 수행 된 작업의 출력을 인쇄하기 때문에이를 확인했습니다. 컴파일러는 불평하지 않기 때문에 이것이 잘못되었다고 생각하지 않았습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

질문 : 함수에 의해 수행 된 작업의 출력이 동일한 배열에 저장되도록 accData[bb] 함수에 전달할 수있는 방법이 있습니까?

+0

업데이트 된 코드로 게시물을 수정할 수 있습니까? –

답변

0

저는 32 비트 시스템을 사용하고 있다고 생각합니다. 그러면 포인터는 32 비트이고, double은 64 비트입니다.

이것은 루프에서 "두 번째 차원"의 할당이 잘못되어 필요 한 데이터의 만 할당한다는 것을 의미합니다. 이를 해결하려면 루프의 calloc 호출에서 sizeof(double)으로 변경하십시오.

기술적으로는 fftAndsubtract에있는 accData 인수의 유형을 포인터로 변경하는 것이 좋습니다. 포인터를 전달하는 것이 좋습니다.

+0

저는 64 비트 시스템에 있습니다. 나는 이것을'sizeof (double)'로 바꾸었고 함수 정의를'double * accData'로 바꿨습니다. 그러나 문제는 여전히 있습니다. 문제가 함수에있을 수 있습니다. 확인할 수 있습니다. 감사! – Kitchi

0

나는 당신이 그것을하고있는 방식을 좋아한다. 처음 질문을 읽을 때 나는 가치있는 가치를 추구하기 위해 멋진 색인 생성을해야한다고 생각했다. 그러나 나는 더 가까이서 보았고, 나는 배열을 좋아한다. 배열 아이디어의. 이것은 내가 그것을 구현하는 것이 방법이다 : 첫 번째 행은 생각하기 때문에

double *accData = calloc(nbox, sizeof(double *)); // Alloc array of double* pointers 
for(bb = 0; bb < nbox; bb++) 
    accData[bb] = calloc(usedTime * usedChan, sizeof(double)); // Alloc array of doubles 

for(bb = 0; bb < nbox; bb++) 
    fftAndsubtract(accData[bb], ntime, nchan, nsigma, bb); 
    // Remember accData is an array of an array of doubles 
    //  accData[bb] is an array of doubles 

... 

int fftAndSubtract(double* accData, int nTime, int nchan, int nsigma, int bb) { 
    ... do fancy fft stuff ... 
    for(int i=0; i < nTime * nchan; i++) { // loop through entire array 
     double result = ... do stuff with accData[i] ... 
     accData[i] = result; 
    } 
    return someReturnValue; 
} 

이 내가 당신의 ACCDATA가 메모리에 배치하는 방법에 대해 생각하는 방법이다 (이 나쁜 연속 데이터의 첫 번째 행 이후의 열() 또한 인접한 데이터이지만 열에 서로 상관 관계가 없음).

 
double* accData[0]  accData[1]  accData[2]  accData[3]  accData[4] 
double accData[0][0] accData[1][0] accData[2][0] accData[3][0] accData[4][0] 
double accData[0][1] accData[1][1] accData[2][1] accData[3][1] accData[4][1] 
double accData[0][2] accData[1][2] accData[2][2] accData[3][2] accData[4][2] 
double accData[0][3] accData[1][3] accData[2][3] accData[3][3] accData[4][3] 
double accData[0][4] accData[1][4] accData[2][4] accData[3][4] accData[4][4] 
+0

나는 nTime == usedTime과 nchan == usedChan이라고 가정하고있다. –