0

我有一个在运行时动态分配的二维数组,就像这样

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]给函数,以便函数完成的操作的输出存储在同一个数组中?

4

2 回答 2

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 在内存中的布局方式的看法(虽然这很糟糕,因为第一行是连续数据,而列(第一行之后)也是连续数据,但列彼此之间没有关联) :

双* accData[0] accData[1] accData[2] accData[3] accData[4]
双 accData[0][0] accData[1][0] accData[2][0] accData[3][0] accData[4][0]
双 accData[0][1] accData[1][1] accData[2][1] accData[3][1] accData[4][1]
双 accData[0][2] accData[1][2] accData[2][2] accData[3][2] accData[4][2]
双 accData[0][3] accData[1][3] accData[2][3] accData[3][3] accData[4][3]
双 accData[0][4] accData[1][4] accData[2][4] accData[3][4] accData[4][4]
于 2013-07-09T13:56:22.990 回答
0

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

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

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

于 2013-07-09T11:59:07.307 回答