C++ fftw3的常数正确性 总结
如果外部库的函数需要一个非常量指针(C++ fftw3的常数正确性 总结,c++,constants,well-formed,C++,Constants,Well Formed,如果外部库的函数需要一个非常量指针(double*),但已知它的值保持不变,那么根据常量的正确性,我应该传递一个常量指针(const double*) 形势 我想创建一个函数来计算向量的自相关性,但不幸的是,(这是一个C API)似乎并不关心常量的正确性。 我想调用的函数是: fftw_plan fftw_plan_dft_r2c_1d(int n0, double *in, fftw_complex *out,
double*
),但已知它的值保持不变,那么根据常量的正确性,我应该传递一个常量指针(const double*
)
形势
我想创建一个函数来计算向量的自相关性,但不幸的是,(这是一个C API)似乎并不关心常量的正确性。
我想调用的函数是:
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;
}
向量自相关(常量向量和数据)
{
向量ret(data.size(),0);
//准备其他变量
fftw_plan a=fftw_plan_dft_r2c_1d(大小和数据.front(),tmp,fftw_估算);
//做剩下的工作
返回ret;
}
当然,这不起作用,因为我的函数的参数是
const vector&data
,所以我不能调用&data.front()
。保持代码常量正确性的最合适的解决方案是什么?如果您遇到一个C API,它在const
-正确性方面的承诺比它显示的要多,那么是时候const\u 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;
}
向量自相关(常量向量和数据)
{
向量ret(data.size(),0);
//准备其他变量
fftw_plan a=fftw_plan_dft_r2c_1d(大小、常数转换(&data.front())、tmp、fftw_估算值);
//做剩下的工作
返回ret;
}
还应注意以下内容中的这句话:
in和out指向变换的输入和输出数组,它们可能相同(生成就地变换)。除非在标志中使用FFTW_估计值,否则在规划期间将覆盖这些数组
由于您使用的是FFTW\u ESTIMATE
标志,因此在这种情况下您应该不会有问题
FFTW开发人员决定不为了
const
而复制此函数的原因是,在C中,const
一点都不重要,FFTW是一个C库。首先针对库提交一个bug报告,然后const\code>消除和data.front()的const,例如const\code>(&data.front())
快速而肮脏的解决方案:如果确定函数中的数据没有更改,可以将其强制转换为非常量:而不是&data.front()使用(常量双*)&data.front().我不想只使用一个小C代码就破坏我代码的常量正确性。当维护一个大代码时,这些小事情可能会非常令人不安。