我正在尝试用C中的Numerical Recipes实现3D傅立叶变换的例程。它们具有这些功能
void rlft3(double ***data, double **speq, unsigned long nn1, unsigned long nn2, unsigned long nn3, int isign);
void fourn(double data[], unsigned long nn[], int ndim, int isign);
(他们最初有float
,我改为double
。)
他们从fourn()
中调用rlft3()
,如下所示:
fourn(&data[1][1][1]-1,nn,3,isign);
我修改为
fourn(&data[0][0][0],nn,3,isign);
当我这样做时,我只得到第一列 - 换句话说,一个维度 - 我的矩阵data
通过,而不是整个事物。这对我来说是模糊的,因为(据我理解代码&data[i][j][k]
)我只传递了一个“单个”指针,指向实际上由三指针引用的东西 - 但是它应该在它们编写时起作用吗?如果是这样,编译器如何知道其他维度在哪里?
我无法理解为什么我的电话无法正常工作,因为我不太清楚这里的策略是什么。
好的,我99%肯定我弄清楚问题是什么:
尽管NR(实际上,它是1988年第二版完整的FORTRAN风格索引)函数rlft3()
被编写为接受double ***data
作为参数,但它的设计使得这个三重指针必须是一个单独声明的指针然后参考/指向已经存在并静态声明的数组。我所做的是从包装函数向rlft3()
发送一个矩阵***data
,其中三重指针直接动态分配给它。因此,内存不是连续的,并且无法从使用&运算符传递的一个指针中找到所有内存,因为我认为如果它指向静态分配的数组。