我正在尝试用FFTW进行多维真实变换。根据{{3}},函数定义如下:
fftw_plan fftw_plan_r2r(int rank,
const int *n,
double *in,
double *out,
const fftw_r2r_kind *kind,
unsigned flags);
此外,关于第五个论点:
每个维度都有一个类型参数,类型为fftw_r2r_kind,指定 那种用于该维度的r2r变换。 (在这种情况下 fftw_plan_r2r,这是一种数组[rank],其中kind [i]是 变换为维度n [i]的种类。)种类可以是一组中的一种 预定义常量的定义,在以下小节中定义。
我在分配种类阵列时遇到了麻烦。以下是我尝试过的一些事情:
这给了我一个“只读变量不可分配”的错误:
const fftw_r2r_kind *kind;
kind = (fftw_r2r_kind*) fftw_malloc(sizeof(fftw_r2r_kind) * 2);
kind[0] = FFTW_REDFT11;
kind[1] = FFTW_REDFT11;
p = fftw_plan_r2r(WorkImageType::ImageDimension, n, in, out, kind, FFTW_ESTIMATE);
这给了我一个“意外的表达”错误:
const fftw_r2r_kind *kind;
kind = (fftw_r2r_kind*) fftw_malloc(sizeof(fftw_r2r_kind) * 2);
kind[0] = FFTW_REDFT11;
kind[1] = FFTW_REDFT11;
p = fftw_plan_r2r(WorkImageType::ImageDimension, n, in, out, kind, FFTW_ESTIMATE);
这给了我一个奇怪的“无法用'fftw_r2r_kind_do_not_use_me'类型的右值初始化'const fftw_r2r_kind *'(又名'const fftw_r2r_kind_do_not_use_me *')类型的数组元素”错误:
const fftw_r2r_kind *kind[2] = {FFTW_REDFT11, FFTW_REDFT11};
p = fftw_plan_r2r(WorkImageType::ImageDimension, n, in, out, kind, FFTW_ESTIMATE);
我是C ++和FFTW的新手,我很难过 - 我真的很感激任何建议!
答案 0 :(得分:2)
您看到的错误是由于尝试为const
变量赋值并混淆指针/数组而导致的。
在前两种情况下,您声明:
const fftw_r2r_kind *kind;
这是指向const fftw_r2r_kind
对象(或其数组中的第一个)的(非常量)指针。然后分配内存并将指针存储在此变量中,这很好。但是,由于您告诉编译器这些对象是const
,因此尝试为它们赋值将失败。
请注意,const fftw_r2r_kind *kind
定义中的fftw_plan_r2r()
位并不意味着您必须以相同的方式声明最终传递给它的变量。函数声明中的const
是一个承诺,即该函数不会触及传入的值,而不是要求值在该函数之外实际为const
(尽管它们可以是)。
在上一个示例中,错误源于您声明:
const fftw_r2r_kind *kind[2] = { ... };
这是一个指向const fftw_r2r_kind
的两个指针数组的声明,而不是两个const fftw_r2r_kind
的数组。然后尝试使用两个非指针值初始化数组。在这种情况下,由于您声明了数组本身,而不是指向保存对动态分配数组的引用的指针,因此它应该只是const fftw_r2r_kind kind[2] = { ... };
。这应该允许您在声明时正确初始化数组,这是在const
数组中设置值的正确方法。