2011-09-22 53 views
0

我使用這個代碼:GtkTextBuffer問題,令人困惑的運行時錯誤。需要幫忙?

class editbook 
{ 
    GtkWidget* _nbook; 
    std::vector<GtkWidget*> _srcset; //and so on... 

................................... .................................................. ......

void editbook::add_page() 
{ 
    GtkWidget* tmp = gtk_source_view_new(); 
    _srcset.push_back(tmp); 
    gtk_notebook_append_page(GTK_NOTEBOOK(_nbook),tmp,gtk_label_new("untitled")); 
} 

..................................... .................................................. ...

void editbook::set_text(const std::string& text) 
{ 
    int index = gtk_notebook_get_current_page(GTK_NOTEBOOK(_nbook)); 
    GtkTextBuffer* tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset[index])); 
    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(tbuffer),text.c_str(),-1); 
} 

編譯好。但是,給這個奇怪的運行時錯誤:

Segementation故障:返回139

我已經跟蹤下來的問題:gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset[index]));

注:我使用的GtkSourceView代替GtkTextView,但可能不會是一個問題因爲我在嘗試GtkTextView時發現了相同的錯誤。

注意:我使用GTK 2X

注:我不知道是否與標籤C或C這個問題++。 BEC。 Gtk +是一個C庫。但我正在使用C++。所以我現在只需標記兩者。

+1

你可以發佈什麼'_srcset'數組?順便說一句,爲什麼你不使用'GtkMM'(http://www.gtkmm.org/en/),它是C++封裝在'Gtk'上,以防你想用C++編寫你的代碼? –

+0

@ another.anon.coward'std :: vector _srcset'。充滿了GtkSourceViews(gtk_source_view_new());至於GtkMM。坦率地說,我不使用它,因爲我是一個白癡...並且因爲它不能在Ubuntu上編譯出於某種原因(glibmmconfig.h未找到) – ApprenticeHacker

+0

您無法顯示足夠的信息。告訴我們你在什麼地方定義了_srcset,以及爲什麼'_srcset [index]'在執行時必須是一個有效的引用。 – sehe

回答

1

在你的代碼的問題可能是因爲孩子小部件通過gtk_notebook_append_page加入GtkNotebook可見,試圖通過顯示來電gtk_widget_show子構件。一些在這些線路上:

void editbook::add_page() 
{ 
    GtkWidget* tmp = gtk_source_view_new(); 
    _srcset.push_back(tmp); 
    gtk_widget_show(tmp); //Show the child widget to make it visible 
    gtk_notebook_append_page(GTK_NOTEBOOK(_nbook),tmp,gtk_label_new("untitled")); 
} 

當您使用gtk_notebook_get_current_page如果沒有子構件是可見的話,返回-1,我認爲你的情況可能發生的&爲index-1當您使用operator[]這沒有按」檢查程序崩潰的界限。我強烈建議您使用​​而不是使用operator[],以便在運行時出現std::out_of_range異常以指示問題。你可以使用:

void editbook::set_text(const std::string& text) 
{ 
    int index = gtk_notebook_get_current_page(GTK_NOTEBOOK(_nbook)); 
    GtkTextBuffer* tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset.at(index))); 
    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(tbuffer),text.c_str(),-1); 
} 

希望這有助於!