[英]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.