我正在尝试编写一个小帮助类来绘制一个mandelbrot分形。类Canvas
有两个二维数组,一个用于存储复平面的坐标,另一个用于获取|z|
超过2所需的迭代次数。
模板参数指定画布的宽度和高度(以像素为单位)。现在有趣的是,一切都适用于<500, 500>
的参数,但如果我选择例如<600, 600>
,我会遇到分段错误。我已经使用array.at()
代替array[]
检查了越界错误,但仍然没有。
template <std::size_t W, std::size_t H>
class Canvas
{
public:
Canvas(std::complex<double> _origin, std::complex<double> _end);
...
private:
std::complex<double> origin;
std::complex<double> end;
std::array<std::array<std::complex<double>, H>, W> field;
std::array<std::array<std::pair<bool, int>, H>, W> results;
};
template <std::size_t W, std::size_t H>
Canvas<W, H>::Canvas(std::complex<double> _origin,
std::complex<double> _end)
: origin{_origin}, end{_end}
{
double delta_x {end.real() - origin.real()};
double delta_y {end.imag() - origin.imag()};
double step_x {delta_x / static_cast<double>(W-1)};
double step_y {delta_y / static_cast<double>(H-1)};
for (std::size_t w = 0; w < W; ++w)
{
for (std::size_t h = 0; h < H; ++h)
{
field[w][h].real(origin.real() + (step_x*w));
field[w][h].imag(origin.imag() + (step_y*h));
}
}
}
答案 0 :(得分:4)
我已经运行了代码,看起来你得到的是堆栈溢出(具有讽刺意味)。 你可以看到它,因为它失败了:
; Find next lower page and probe
cs20:
sub eax, _PAGESIZE_ ; decrease by PAGESIZE
test dword ptr [eax],eax ; probe page. <------ HERE
jmp short cs10
你也可以通过以下事实看到这一点:在数据开始变大并将其分配到堆上之后,它会在某个点之后开始失败。 你的Canvas对象很大,因为:
std::array<std::array<std::complex<double>, H>, W> field;
std::array<std::array<std::pair<bool, int>, H>, W> results;
尺寸为H * W * sizeof(complex<double>)
或H * W * sizeof(pair<bool,int>)
。
我建议你只需在堆上使用这个类,并且在使用高模板号时不要将它分配到堆栈上(对于400,400,我已经失败了)。
答案 1 :(得分:1)
我认为您的问题可能是您在堆栈上分配Canvas
的实例。如果您有这样的事情:
void f()
{
std::complex<double> origin( 0, 0 );
std::complex<double> end( 100, 100 );
Canvas< 600, 600 > cv( origin, end );
// ...
}
您可能需要检查在堆上分配对象是否有帮助:
void f()
{
std::complex<double> origin( 0, 0 );
std::complex<double> end( 100, 100 );
typedef Canvas< 600, 600 > CV
auto cv_ptr = std::unique_ptr< CV >( new CV( origin, end ) );
// ...
}