постоянная корректность fftw3

Резюме

Что я могу сделать, если функция внешней библиотеки ожидает неконстантный указатель (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(), Какое решение является наиболее подходящим для сохранения правильности моего кода?

0

Решение

Если вы столкнулись с C API, который обещает больше, чем показывает в отношении constКорректность, пора 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;
}

Также обратите внимание на это предложение в документация:

точки входа и выхода указывают на входные и выходные массивы преобразования, которые могут быть одинаковыми (в результате получается преобразование на месте). Эти массивы перезаписываются во время планирования, если в флагах не используется FFTW_ESTIMATE.

Поскольку вы используете FFTW_ESTIMATE флаг, у вас все будет хорошо в этом случае.

Причина, по которой разработчики FFTW решили не дублировать эту функцию ради const что в С, const совсем не страшно, а FFTW — это библиотека C

1

Другие решения

Сначала подайте отчет об ошибке в библиотеку, затем const_cast прочь постоянство &data.front(), например const_cast<double*>(&data.front())

1

По вопросам рекламы [email protected]