我正在尝试从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]
)我只传递一个“单个”指针指向实际由三指针引用的东西 - 但它是假设的他们写作时工作?如果是这样,编译器如何知道其他维度在哪里?
我无法理解为什么我的电话无法正常工作,因为我不太清楚这里的策略是什么。
答案 0 :(得分:0)
好的,我99%确定我弄清楚问题是什么:
尽管NR(实际上它是1988年第二版完成FORTRAN风格的索引)函数rlft3()
被编写为接受double ***data
作为参数,但它是设计的因此,这个三重指针必须是一个单独声明的指针,然后在已经存在的数组中引用/指向并且被静态声明。我所做的是从包装函数发送rlft3()
矩阵***data
,其中三重指针已直接动态分配给它。因此,内存不是连续的,并且无法从使用&传递的一个指针找到所有内存。运算符,因为我认为如果它指向静态分配的数组。