首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFTW: fftw_plan_r2r()的善意论证

FFTW: fftw_plan_r2r()的善意论证
EN

Stack Overflow用户
提问于 2014-05-28 17:34:51
回答 1查看 1.1K关注 0票数 1

我试着用FFTW做一个多维的实到实的转换。根据文献资料,该函数定义如下:

代码语言:javascript
复制
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的情况下,这是一个数组kindi,其中kindi是维度ni的转换类型。)这类可以是一组预定义的常量之一,在下面的小节中定义。

我很难分配这类数组。以下是我尝试过的几件事:

这给了我一个“只读变量不可分配”错误:

代码语言:javascript
复制
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);

这给了我一个“意外表达式”错误:

代码语言:javascript
复制
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 *‘(又名'const fftw_r2r_kind_do_not_use_me *')类型的数组元素( rvalue为’fftw_r2r_kind_do_not_use_me‘)的错误:

代码语言:javascript
复制
const fftw_r2r_kind *kind[2] = {FFTW_REDFT11, FFTW_REDFT11};
p = fftw_plan_r2r(WorkImageType::ImageDimension, n, in, out, kind, FFTW_ESTIMATE);

我对C++和FFTW都是新手,而且很困惑--我真的很感激你的任何建议!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-28 20:04:27

您所看到的错误是由于试图将值赋值给const变量以及对指针/数组的混淆所致。

在前两种情况中,您声明:

代码语言:javascript
复制
const fftw_r2r_kind *kind;

这是指向const fftw_r2r_kind对象的(非const)指针(或此类对象数组中的第一个指针)。然后分配内存并将指针存储在这个变量中,这很好。但是,由于您告诉编译器这些对象将是const,因此尝试为它们赋值将失败。

注意,const fftw_r2r_kind *kind定义中的fftw_plan_r2r()位并不意味着您必须以相同的方式声明最终传递给它的变量。函数声明中的const是一个承诺,即该函数不会接触传入的值,而不是要求该值实际上是该函数之外的const (尽管它们可以)。

在最后一个示例中,错误源于以下事实:

代码语言:javascript
复制
const fftw_r2r_kind *kind[2] = { ... };

这是一个由两个指向const fftw_r2r_kind的指针组成的数组的声明,而不是两个const fftw_r2r_kind的数组。然后尝试用两个不是指针的值初始化数组。在这种情况下,由于您声明的是数组本身,而不是保存对动态分配数组的引用的指针,所以它应该是const fftw_r2r_kind kind[2] = { ... };。这应该允许您在声明时正确地初始化数组,这是在const数组中设置值的正确方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23918286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档