2011-09-22 58 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); 
} 

希望这有助于!