Следующий код работает в симуляторе Marmalade (я использую x-code для OSX)
bool PictureDictionary::OnTableSelect(CTable* table, int tab){
//if something is selected, look up the item, and display it
//also change the search to the selected item
if(-1 < tab){
// if a term is selected, set the search text field to the term
CString term = m_SearchResults.GetString(tab);
if(m_currentWord != (char*)term.Get()){
m_currentWord = (char *)term.Get();
m_searchTextField->SetAttribute("text", term);
char* normalizedTerm = (char *)term.Get();
char* imagePath;
sprintf(imagePath,"images/%s.jpg", normalizedTerm);
if(m_ImageAttached){
m_Image->SetAttribute("image", (const char*)imagePath);
} else {
m_Image = CreateImage(CAttributes()
.Set("name", "picture")
.Set("x1", "0")
.Set("x2", "0")
.Set("y1", "50%")
.Set("image", (const char*)imagePath)
);
m_SearchView->AddChild(m_Image);
m_ImageAttached = true;
}
}
}
return true;
}
Когда я запускаю симулятор и выбираю элемент из таблицы, изображение появляется и изменяется, когда я выбираю другой элемент. Когда я иду на рефакторинг, я получаю ошибку EXC_BAD_ACCESS (code = 1… ..)
bool PictureDictionary::OnTableSelect(CTable* table, int tab){
//if something is selected, look up the item, and display it
//also change the search to the selected item
if(-1 < tab){
// if a term is selected, set the search text field to the term
CString term = m_SearchResults.GetString(tab);
if(m_currentWord != (char*)term.Get()){
m_currentWord = (char *)term.Get();
m_searchTextField->SetAttribute("text", term);
char* normalizedTerm = (char *)term.Get();
char* imagePath;
sprintf(imagePath,"images/%s.jpg", normalizedTerm);
UpdatePictureView(imagePath);
}
}
return true;
}
void PictureDictionary::UpdatePictureView(char* imagePath){
if(m_ImageAttached){
m_Image->SetAttribute("image", (const char*)imagePath);
} else {
m_Image = CreateImage(CAttributes()
.Set("name", "picture")
.Set("x1", "0")
.Set("x2", "0")
.Set("y1", "50%")
.Set("image", (const char*)imagePath)
);
m_SearchView->AddChild(m_Image);
m_ImageAttached = true;
}
}
Любые предложения о том, как очистить код без этих проблем?
Редактировать RE Комментарии о неинициализированных переменных:
m_ImageAttached был инициализирован как false в конструкторе, если я не делаю что-то не так. Кроме того, изменение условия для проверки, если m_Image! = NULL, также вызывает ту же ошибку.
main.cpp:
PictureDictionary pictDict(myApp, &dictionary);
Конструктор для PictureDictionary:
PictureDictionary::PictureDictionary(CAppPtr app,Dictionary::Dictionary* dictionary){
m_App = app;
m_Dictionary = dictionary;
m_currentWord = "";
m_ImageAttached = false;
}
imagePath
является унифицированным указателем в обоих фрагментах. Любая попытка разыменования является неопределенным поведением. Это просто появилось Работа в первом фрагменте. Использовать массив или заполнить std::string
вместо:
std::string imagePath(std::string("images/") + normalizedTerm + ".jpg");
И использовать std::string::c_str()
если доступ к базовому const char*
необходимо.
Других решений пока нет …