2012-04-09 4 views
0

Я пишу графический интерфейс, который в основном отображает разделы изображений пользователю и запрашивает ввод. Однако у меня есть странная проблема. Около 40% времени, когда я запускаю программу, я получу ошибку seg. Другие 60% времени он работает нормально, с тем же самым вводом. Благодаря в основном заявления печати мне удалось сузить ошибку сегм до этой линии:wxWidgets непредсказуемый Seg fault

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

Я пытался объявить значения wxRect и wxPoint вне вызова GetSubImage, но это не сработало.

Это особый случай, когда подраздел изображения, который будет отображаться, находится за пределами края изображения. Этот конкретный случай просто является первым таким подразделением для отображения. Изображение - это изображение, загруженное из файла типа 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; 
+0

Если вы хотите добавить еще код, это будет замечательно – vidit

+0

Попробуйте сузить область использования отладчика (если возможно, GDB). Возможная причина - неинициализированный указатель. Проводка большего количества кода может помочь нам дать точные ответы. –

+0

@vidit Я добавил еще код – user1313921

ответ

0

Из того, что я понимаю SubImage охватывает вне изображения? Я не могу сказать вам решение вашей конкретной проблемы, но я могу дать вам два общих советов при работе с WxWidgets:

  • Задайте свои вопросы в WX списке рассылки, они имеют отличную поддержку и есть большой шанс, что основной разработчик ответит на ваш вопрос.
  • Исходный код - ваш друг. Код wxWidgets действительно чистый и хорошо структурированный, легко читаемый. Поэтому вы можете попытаться построить с помощью отладочной версии wxWidgets и запустить приложение под отладчиком, чтобы узнать, что происходит. Когда ваше приложение разбивает udner отладчика, вы увидите, где в коде wxWidgets произошел сбой, и вы можете видеть, что происходит.