我有一个我在运行时动态分配的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]
传递给函数,以便函数完成的操作输出存储在同一个数组中?
答案 0 :(得分:0)
我猜你是在32位机器上。那么指针是32位,而double
是64位。
这意味着您在循环中分配“第二维”是错误的,并且只分配所需数据的一半。要解决此问题,请在循环中的sizeof(double)
调用中更改为calloc
。
从技术上讲,您可能希望将accData
中fftAndsubtract
参数的类型更改为指针,因为这就是您传递它的内容。
答案 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]