将2D动态数组的一维传递给函数

时间:2013-07-09 11:49:50

标签: c pointers multidimensional-array dynamic-allocation

我有一个我在运行时动态分配的2D数组,如此

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

我想只将第二个维度传递给我的函数。此数组表示在几个不同的“框”中定义的数据,对于每个框,我想将相关信息传递给函数,处理它并将其存储在同一个数组中。目前我正在这样做 -

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

其中fftAndSubtract执行FFT(快速傅里叶变换)和一些其他操作。函数定义如下:

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

accData似乎不包含fftAndSubtract生成的修改后的值。我已经验证了这一点,因为我正在打印函数本身完成的操作的输出。编译器没有抱怨,所以我认为这不对。有更好的方法吗?

问题:有没有办法可以将accData[bb]传递给函数,以便函数完成的操作输出存储在同一个数组中?

2 个答案:

答案 0 :(得分:0)

我猜你是在32位机器上。那么指针是32位,而double是64位。

这意味着您在循环中分配“第二维”是错误的,并且只分配所需数据的一半。要解决此问题,请在循环中的sizeof(double)调用中更改为calloc

从技术上讲,您可能希望将accDatafftAndsubtract参数的类型更改为指针,因为这就是您传递它的内容。

答案 1 :(得分: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]