繁体   English   中英

fftw3的const正确性

[英]const correctness of fftw3

摘要

如果外部库的函数期望非const指针( double * ),但是我知道它的值保持不变,那么根据const的正确性,我应该传递一个const指针( const double * ),我该怎么办?

情况

我想创建一个计算向量自相关的函数,但遗憾的是fftw3 (它是一个C API)似乎并不关心const的正确性。 我想要的功能是:

fftw_plan fftw_plan_dft_r2c_1d(int n0,
                                    double *in, fftw_complex *out,
                                    unsigned flags);

我想创建的代码:

vector<double> autocorr(const vector<double>& data)
{
    vector<double> ret(data.size(), 0);
    // prepare other variables
    fftw_plan a = fftw_plan_dft_r2c_1d(size, &data.front(), tmp, FFTW_ESTIMATE);
    // do the rest of the work
    return ret;
}

当然,这不起作用,因为我的函数的参数是const vector<double>& data所以我不能调用&data.front() 保持代码的const正确性的最合适的解决方案是什么?

如果你面对的是一个承诺比const -correctness更多的C API,那么现在是const_cast时候了:

vector<double> autocorr(const vector<double>& data)
{
    vector<double> ret(data.size(), 0);
    // prepare other variables
    fftw_plan a = fftw_plan_dft_r2c_1d(size, const_cast<double*>(&data.front()), tmp, FFTW_ESTIMATE);
    // do the rest of the work
    return ret;
}

还要注意文档中的这句话:

in和out指向变换的输入和输出数组,它们可以是相同的(产生就地变换)。 除非在标志中使用FFTW_ESTIMATE,否则在规划期间会覆盖这些数组。

由于您使用的是FFTW_ESTIMATE标志,因此在这种情况下应该没问题。

FFTW开发人员决定不为const复制这个函数的原因是在C中, const并不是什么大问题,而FFTW是一个C库。

首先提交针对库的错误报告,然后const_cast消除&data.front()的常量,例如const_cast<double*>(&data.front())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM