我已将Mark Borgerding的kissfft.hh(他的FFT代码的模板版本)复制到我的项目中,并将其修改为使用迭代器而不是指针。使用Xcode一切都很好。当我尝试使用Microsoft的Visual C ++ 2017编译后运行它时,我从以下代码获得断言错误:
if (leftInset > 0) {
return UIEdgeInsetsMake(0, leftInset, 0, rightInset)
} else {
return UIEdgeInsetsMake(0, 10, 0, 10)
}
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
之外的“ end”为止。我创建了一个简单的测试程序来检查它是否也触发了断言检查。
std::vector
不是。这里发生了什么?为什么FFT代码会使断言检查失败?我可以通过切换到“发布”模式来解决问题,然后一切正常,但是我想知道我做错了什么。
答案 0 :(得分:0)
原来是@ n.m。完全正确-问题是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;