【问题标题】:Passing one dimension of a 2D dynamic array to a function将二维动态数组的一维传递给函数
【发布时间】:2013-07-07 00:25:09
【问题描述】:

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

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

【问题讨论】:

  • 你能用你更新的代码修改你的帖子吗?

标签: c pointers multidimensional-array dynamic-allocation


【解决方案1】:

我猜您使用的是 32 位机器。那么指针是32位的,而double是64位的。

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

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

【讨论】:

  • 我在 64 位机器上。我改成sizeof(double),函数定义也改成double *accData,但问题依旧。问题可能出在函数中,我可以检查一下。谢谢!
【解决方案2】:

我喜欢你这样做的方式,当我第一次阅读这个问题时,我认为你必须做一些花哨的索引才能从一个值跳到另一个值......但我仔细看了看,我喜欢数组数组的想法。这就是我将如何实现它:

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]

【讨论】:

  • 我假设 nTime == usedTime 和 nchan == usedChan
猜你喜欢
  • 2020-11-01
相关资源
最近更新 更多