0

基本的に画像のサブセクションをユーザーに表示し、入力を求める GUI を作成しています。しかし、私は奇妙な問題を抱えています。プログラムを実行すると、約 40% の確率でセグ フォールトが発生します。残りの 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 を使用する際の一般的なアドバイスを 2 つお伝えできます。

  • wx-users メーリング リストで質問してください。彼らは優れたサポートを提供しており、コア開発者があなたの質問に答える可能性が高いです。
  • ソースコードはあなたの友達です。wxWidgets のコードは非常にきれいで、よく構造化されており、簡単に読むことができます。したがって、wxWidgets のデバッグ バージョンを使用してビルドし、デバッガーでアプリを実行して、何が起こっているかを確認できます。アプリがデバッガー内でクラッシュすると、wxWidgets コードのどこでクラッシュしたかがわかり、何が起こっているかがわかります。
于 2012-04-10T09:51:16.880 に答える