0

次のコードはマーマレードシミュレーターで動作します(私はxコードを使用して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;
}
4

1 に答える 1

1

imagePath両方のスニペットで、単一化されたポインターです。逆参照の試みは未定義の動作です。最初のスニペットで機能しているように見えました。配列を使用するか、std::string代わりにa を入力します。

std::string imagePath(std::string("images/") + normalizedTerm + ".jpg");

std::string::c_str()基になるものへのアクセスが必要な場合に使用しますconst char*

于 2013-03-15T16:38:44.667 に答える