Отключение итератора утверждение Visual C ++ 2017 - PullRequest
0 голосов
/ 23 сентября 2018

Я скопировал 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, тогда все отлично работает, но я хочу знать, что я делаю что-то не так.

1 Ответ

0 голосов
/ 23 сентября 2018

Оказывается, что @nm был совершенно прав - проблема была в fft_in, а не в fft_out, как я и думал.Я развернул последнюю итерацию цикла do...while, чтобы избежать проблемы без снижения производительности (я думаю).

 ComplexIterator const Fout_beg = fft_out;
 ComplexIterator const Fout_end = fft_out + p*m;

 ComplexIterator const Fout_almost_end = Fout_end - 1;
 do{
     *fft_out = *fft_in;
     fft_in += fstride;
 }while (++fft_out != Fout_almost_end);
 *fft_out = *fft_in;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...