GTK gtk_text_buffer_get_end_iter和gtk_text_buffer_insert 错误
本帖最后由 warmb2009 于 2010-08-24 13:04 编辑
- #include <gtk/gtk.h>
- #include <string.h>
- #include <stdlib.h>
- /*向回调函数传两个参数*/
- typedef struct
- {
- GtkWidget *entry;
- GtkTextBuffer *buffer;
- }strentry;
- /*
- ( button )scan的回调函数 , 执行shell命令 将输出返回给text_view
- */
- void callback( GtkWidget *widget, strentry *sentry )
- {
- const gchar *text;
- gchar com[50] = "nmap ";
- FILE *fpin;
- char buf[1024] = {''};
- GtkTextIter start, end;
- text = gtk_entry_get_text( GTK_ENTRY( sentry->entry ) );
- strcat( com, (char * )text );
- if( ( fpin = popen( com, "r" ) ) == NULL )
- {
- printf("popen error!n");
- exit( 0 );
- }
- fread( buf, sizeof( char ), sizeof( buf ), fpin );
- /*
- 将shell命令结果返回给text_view
- */
- gtk_text_buffer_get_end_iter ( sentry->buffer, &end );
- gtk_text_buffer_insert( sentry->buffer, &end, buf, -1 );
- pclose( fpin );
- }
- gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
- {
- gtk_main_quit ();
- return FALSE;
- }
- /*
- 初始化text_view
- */
- void insert_text (GtkTextBuffer *buffer)
- {
- GtkTextIter iter;
- gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
- gtk_text_buffer_insert (buffer, &iter, " NMAP GUI n", -1);
- }
- /*
- 创建一个文本框 两个按钮
- */
- GtkWidget *creat_button( GtkWidget *table ,strentry *sentry )
- {
- GtkWidget *button;
- GtkWidget *label;
- /*const gchar *text;*/
- label = gtk_label_new("Command: ");
- gtk_table_attach_defaults(GTK_TABLE( table ), label, 0, 2, 1, 2 );
- gtk_widget_show( label );
- sentry->entry = gtk_entry_new();
- gtk_table_attach_defaults(GTK_TABLE( table ), sentry->entry, 2, 10, 1, 2 );
- gtk_widget_show (sentry->entry);
- button = gtk_button_new_with_label ("Scaning!");
- g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), sentry );
- gtk_table_attach_defaults(GTK_TABLE( table ), button, 15, 17, 1, 2 );
- gtk_widget_show( button );
- button = gtk_button_new_with_label("Stop");
- g_signal_connect(G_OBJECT (button), "clicked", G_CALLBACK(delete_event), NULL);
- gtk_table_attach_defaults(GTK_TABLE( table ), button, 17, 19, 1, 2 );
- gtk_widget_show ( button );
- return table;
- }
- /*
- 创建text_view
- */
- GtkWidget *creat_text( GtkTextBuffer *buffer )
- {
- GtkWidget *scrolled_window;
- GtkWidget *view;
- view = gtk_text_view_new ();
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (scrolled_window), view);
- insert_text (buffer);
- gtk_widget_show_all (scrolled_window);
- return scrolled_window;
- }
- int main( int argc, char *argv[] )
- {
- GtkWidget *window;
- GtkWidget *button;
- GtkWidget *text;
- GtkWidget *table;
- strentry *sentry;
- /*
- 初始化窗口
- */
- gtk_init (&argc, &argv);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size( GTK_WINDOW( window ), 1024, 800 );
- /*
- 添加按钮事件
- */
- gtk_window_set_title (GTK_WINDOW (window), "Nmap easy scan");
- g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL );
- gtk_container_set_border_width (GTK_CONTAINER (window), 10);
- table = gtk_table_new( 20, 20, TRUE );
- gtk_container_add( GTK_CONTAINER( window ), table );
- /*
- 创建外观元素
- */
- button = creat_button( table, sentry );
- text = creat_text( sentry->buffer );
- gtk_table_attach_defaults(GTK_TABLE( table ), text, 0, 20, 4, 20 );
- gtk_widget_show( text );
- gtk_widget_show ( table );
- gtk_widget_show ( window );
- gtk_main ();
- return 0;
- }
复制代码当触发callback() 时也就是第十六行的函数
出现错误:
- (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_get_end_iter: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed
- (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_insert: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed
复制代码求助诸位大牛 , 希望帮帮忙解决这个问题 ,小弟不甚感激!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
晕,我哪个回复怎么成2楼了?时间也不对了。
回复 3# warmb2009
将所有回调之外的函数整合近main,那creat_text这个函数你是怎么整合的?
是在main中直接给 strentry的buffer成员赋值吧:
复制代码这样当然没问题了,因为 strentry的成员buffer正确赋值了,以后用才不会出问题。而当你把 TextBuffer作为一个参数的时候,
在函数体内部怎么折腾这个参数都不影响函数之外,因为c语言是参数传递机制是值调用,这些值被放在被调用函数的形参的内存位置上(就是栈中)。
原来的变量还在那儿,没有被修改。
这都是c语言基础的东西。lz以前不是搞c的吗?搞java的?java对于不是基本类型的参数采用的是引用调用
回复 1# warmb2009
我回复了。
你的main函数里,sentry这个指针是个野指针,没有赋过值,所以到了回调函数里,指针指向的buffer和entry,都可能会有问题
将所有除回调函数以外的函数整合进main , 就没有错误了....这是什么原因阿 ??是不是作用域的问题阿??
本帖最后由 nketc 于 2010-11-11 00:15 编辑
有两处需要修改:
1)main中没有给strentry分配空间
2)creat_text的 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); 是有问题的,这样复制只是修改的栈中的局部变量,而 strentry->buffer仍然是随机值。
修改后的代码如下:
/*
创建text_view
*/
GtkWidget *creat_text( GtkTextBuffer **buffer )
{
GtkWidget *scrolled_window;
GtkWidget *view;
view = gtk_text_view_new ();
*buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scrolled_window), view);
insert_text (*buffer);
gtk_widget_show_all (scrolled_window);
return scrolled_window;
}
int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *text;
GtkWidget *table;
strentry *sentry = g_malloc(sizeof(strentry));
………………
button = creat_button( table, sentry );
text = creat_text( &sentry->buffer );
gtk_table_attach_defaults(GTK_TABLE( table ), text, 0, 20, 4, 20 );
gtk_widget_show( text );
gtk_widget_show ( table );
gtk_widget_show ( window );
gtk_main ();
g_free(strentry);
return 0;
}
红色部分是要修改的地方。
下面是运行截图: