gpt4 book ai didi

c++ - fftw3 的常量正确性

转载 作者:行者123 更新时间:2023-11-28 02:50:15 27 4
gpt4 key购买 nike

总结

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

情况

我想创建一个函数来计算 vector 的自相关,但不幸的是,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()。保持代码常量正确性的最合适解决方案是什么?

最佳答案

如果您遇到的 C API 在 const 正确性方面 promise 比它显示的更多,那么是时候 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;
}

还要注意 documentation 中的这句话:

in and out point to the input and output arrays of the transform, which may be the same (yielding an in-place transform). These arrays are overwritten during planning, unless FFTW_ESTIMATE is used in the flags.

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

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

关于c++ - fftw3 的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23223437/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com