0

我正在编写一个 GUI,它基本上向用户显示图像的子部分并要求输入。但是,我遇到了一个奇怪的问题。当我运行程序时,大约有 40% 的时间会出现 seg 错误。其他 60% 的时间运行良好,输入完全相同。通过主要是打印语句,我设法将段错误缩小到这一行:

subImage = image.GetSubImage(wxRect(wxPoint(0, iheight - 800), wxPoint(800, iheight)));

我尝试在 GetSubImage 调用之外声明 wxRect 和 wxPoint 值,但这也不起作用。

这是要显示的图像的子部分不在图像边缘时的特殊情况。这种特殊情况恰好是要显示的第一个此类子部分。Image 是从 wxImage 类型的文件加载的图像。subImage 也是我实际显示的 wxImage。

最让我困惑的是为什么它只在我使用完全相同的输入时才会发生。非常感谢您在哪里开始工作的任何帮助。提前致谢

我的构造函数的整个代码是:

wxImagePanel::wxImagePanel(wxPanel* parent, wxString file, wxBitmapType format, int xloc, int yloc, int index, wxImage temp) : wxPanel(parent)
{
image = temp;
x = xloc;
y = yloc;
dIndex = index;
int iheight = image.GetHeight();
int iwidth = image.GetWidth();

if(x - 400 < 0)
{
    if(y - 400 < 0)
    {
        subImage = image.GetSubImage(wxRect(wxPoint(0,0), wxPoint(800,800)));
    }
    else if(y + 400 > iheight)
    {
        //here's the random seg fault
        subImage = image.GetSubImage(wxRect(wxPoint(0, iheight - 800), wxPoint(800, iheight)));
    }
    else
    {

        subImage = image.GetSubImage(wxRect(wxPoint(0,y-400), wxPoint(800, y+400)));
    }
}
else if (y - 400 < 0)
{
    if(x + 400 > iwidth)
    {
        subImage = image.GetSubImage(wxRect(wxPoint(iwidth - 800, 0), wxPoint(iwidth, 800)));
    }
    else
    {
        subImage = image.GetSubImage(wxRect(wxPoint(x-400,0),wxPoint(x+400,800)));
    }
}
else if((x + 400 < iwidth) && (y + 400 < iheight))
{
    subImage = image.GetSubImage(wxRect(wxPoint(x-400,y-400),wxPoint(x+400,y+400)));
}
else if(x + 400 > iwidth)
{
    if(y + 400 > iheight)
    {
        subImage = image.GetSubImage(wxRect(wxPoint(iwidth - 800, iheight - 800), wxPoint(iwidth, iheight)));
    }
    else
    {
        subImage = image.GetSubImage(wxRect(wxPoint(iwidth - 800, y-400), wxPoint(iwidth,y + 400)));
    }
}
else
{
    subImage = image.GetSubImage(wxRect(wxPoint(x - 400, iheight - 800),wxPoint(x + 400,iheight)));
}
w = -1;
h = -1;
4

1 回答 1

0

据我了解,子图像跨越图像之外?我不能告诉你特定问题的解决方案,但是当你使用 wxWidgets 时,我可以给你两个一般性建议:

  • 在 wx-users 邮件列表中提出您的问题,他们有很好的支持,核心开发人员很有可能会回答您的问题。
  • 源代码是你的朋友。wxWidgets 的代码非常干净,结构良好,易于阅读。因此,您可以尝试使用 wxWidgets 的调试版本进行构建,并在调试器下运行您的应用程序以查看发生了什么。当您的应用程序在调试器中崩溃时,您将看到 wxWidgets 代码中崩溃的位置,并且您可以看到发生了什么。
于 2012-04-10T09:51:16.880 回答