Я скопировал kissfft.hh Марка Боргердинга (шаблонную версию его FFT-кода) в мой проект и изменил его, чтобы использовать итераторы вместо указателей.С Xcode все хорошо.Когда я пытался запустить его после компиляции с Microsoft Visual C ++ 2017, я получаю ошибку подтверждения из следующего кода:
void transform(ComplexIterator fft_in, ComplexIterator fft_out) const
{
ComplexIterator const Fout_beg = fft_out;
ComplexIterator const Fout_end = fft_out + p*m;
do{
*fft_out = *fft_in;
fft_in += fstride;
}while(++fft_out != Fout_end );
...
ComplexIterator
- это тип шаблона, и в этой ситуации это ваниль std::vector< std::complex<float> >::iterator
.Иногда Fout_end
указывает где-то посередине std::vector
, а иногда указывает одну точку после последнего элемента в std::vector
, точно так же, как std::vector.end()
.Когда он указывает на одну точку после последнего элемента, оператор while
вызывает ошибку подтверждения, поскольку итератор прошел последний элемент в векторе.Он прошел только один (т. Е. Был равен Fout_end
), но это не имело значения.
Дело в том, что я думал, что это стандартная практика для итераторов.Вы продолжаете итерацию, пока не нажмете «конец», который находится за пределами std::vector
.Я создал простую тестовую программу, чтобы проверить, не сработала ли она и с проверкой утверждений.
std::vector<int> p(5);
for (auto it = p.begin(); it != p.end(); ++it) {
std::cout << *it << std::endl;
}
Это не так.Что тут происходит?Почему код FFT отключает проверку утверждений?Я могу избавиться от проблемы, переключившись в режим Release, тогда все отлично работает, но я хочу знать, что я делаю что-то не так.