免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9259 | 回复: 6
打印 上一主题 下一主题

GTK gtk_text_buffer_get_end_iter和gtk_text_buffer_insert 错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-24 12:59 |只看该作者 |倒序浏览
20可用积分
本帖最后由 warmb2009 于 2010-08-24 13:04 编辑
  1. #include <gtk/gtk.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. /*向回调函数传两个参数*/
  5. typedef struct
  6. {
  7.         GtkWidget *entry;
  8.         GtkTextBuffer *buffer;
  9. }strentry;

  10. /*
  11.         ( button )scan的回调函数 , 执行shell命令 将输出返回给text_view
  12.                                                                                 */
  13.                                                                                
  14. void callback( GtkWidget *widget, strentry *sentry )
  15. {
  16.         const gchar *text;
  17.         gchar com[50] = "nmap ";
  18.         FILE *fpin;
  19.         char buf[1024] = {'\0'};
  20.         GtkTextIter start, end;

  21.         text = gtk_entry_get_text( GTK_ENTRY( sentry->entry ) );
  22.         strcat( com, (char * )text );
  23.        
  24.         if( ( fpin = popen( com, "r" ) ) == NULL )
  25.                 {
  26.                         printf("popen error!\n");
  27.                         exit( 0 );
  28.                 }
  29.         fread( buf, sizeof( char ), sizeof( buf ),  fpin );
  30.        
  31. /*
  32.         将shell命令结果返回给text_view
  33.                                                 */
  34.                                                
  35.         gtk_text_buffer_get_end_iter ( sentry->buffer, &end );
  36.         gtk_text_buffer_insert( sentry->buffer, &end, buf, -1 );

  37.         pclose( fpin );
  38.        
  39. }


  40. gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
  41. {
  42.         gtk_main_quit ();
  43.         return FALSE;
  44. }

  45. /*
  46.         初始化text_view
  47.                                 */
  48.                                
  49. void insert_text (GtkTextBuffer *buffer)
  50. {
  51.         GtkTextIter iter;
  52.         gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
  53.         gtk_text_buffer_insert (buffer, &iter, " NMAP GUI \n", -1);
  54. }

  55. /*
  56.         创建一个文本框 两个按钮
  57.                                 */

  58. GtkWidget *creat_button( GtkWidget *table ,strentry *sentry )
  59. {
  60.         GtkWidget *button;
  61.         GtkWidget *label;
  62.         /*const gchar *text;*/

  63.         label = gtk_label_new("Command: ");
  64.         gtk_table_attach_defaults(GTK_TABLE( table ), label, 0, 2, 1, 2 );
  65.         gtk_widget_show( label );
  66.        
  67.         sentry->entry = gtk_entry_new();
  68.         gtk_table_attach_defaults(GTK_TABLE( table ), sentry->entry, 2, 10, 1, 2 );
  69.         gtk_widget_show (sentry->entry);
  70.        
  71.         button = gtk_button_new_with_label ("Scaning!");
  72.         g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), sentry );
  73.         gtk_table_attach_defaults(GTK_TABLE( table ), button, 15, 17, 1, 2 );
  74.         gtk_widget_show( button );
  75.        
  76.         button = gtk_button_new_with_label("Stop");
  77.         g_signal_connect(G_OBJECT (button), "clicked", G_CALLBACK(delete_event), NULL);
  78.         gtk_table_attach_defaults(GTK_TABLE( table ), button, 17, 19, 1, 2 );
  79.         gtk_widget_show ( button );

  80.         return table;
  81.        
  82. }

  83. /*
  84.         创建text_view
  85.                                 */
  86. GtkWidget *creat_text( GtkTextBuffer *buffer )
  87. {
  88.         GtkWidget *scrolled_window;
  89.         GtkWidget *view;
  90.        
  91.         view = gtk_text_view_new ();
  92.         buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  93.         scrolled_window = gtk_scrolled_window_new (NULL, NULL);
  94.         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
  95.                                         GTK_POLICY_AUTOMATIC,
  96.                                         GTK_POLICY_AUTOMATIC);
  97.         gtk_container_add (GTK_CONTAINER (scrolled_window), view);
  98.         insert_text (buffer);
  99.         gtk_widget_show_all (scrolled_window);
  100.        
  101.         return scrolled_window;
  102. }


  103. int main( int argc, char *argv[] )
  104. {

  105.         GtkWidget *window;
  106.         GtkWidget *button;
  107.         GtkWidget *text;
  108.         GtkWidget *table;
  109.         strentry *sentry;
  110.        
  111.         /*
  112.                 初始化窗口
  113.                                 */
  114.                                
  115.         gtk_init (&argc, &argv);
  116.         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  117.         gtk_window_set_default_size( GTK_WINDOW( window ), 1024, 800 );
  118.        
  119.         /*
  120.                 添加按钮事件
  121.                                 */
  122.                                
  123.         gtk_window_set_title (GTK_WINDOW (window), "Nmap easy scan");
  124.         g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL );
  125.         gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  126.         table = gtk_table_new( 20, 20, TRUE );
  127.         gtk_container_add( GTK_CONTAINER( window ), table );
  128.        
  129.         /*
  130.                 创建外观元素
  131.                                 */
  132.                                
  133.         button = creat_button( table, sentry );
  134.         text = creat_text( sentry->buffer );
  135.        
  136.         gtk_table_attach_defaults(GTK_TABLE( table ), text, 0, 20, 4, 20 );
  137.         gtk_widget_show( text );
  138.                
  139.         gtk_widget_show ( table );
  140.         gtk_widget_show ( window );
  141.         gtk_main ();
  142.         return 0;
  143. }
复制代码
当触发callback() 时也就是第十六行的函数
出现错误:
  1. (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_get_end_iter: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed

  2. (gtk2:14413): Gtk-CRITICAL **: gtk_text_buffer_insert: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed
复制代码
求助诸位大牛 , 希望帮帮忙解决这个问题 ,小弟不甚感激!!

最佳答案

查看完整内容

有两处需要修改: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; v ...

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
2 [报告]
发表于 2010-08-24 12:59 |只看该作者
本帖最后由 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;
}

红色部分是要修改的地方。
下面是运行截图:

Screenshot-Nmap easy scan.png (36.11 KB, 下载次数: 57)

Screenshot-Nmap easy scan.png

论坛徽章:
0
3 [报告]
发表于 2010-08-24 15:59 |只看该作者
将所有除回调函数以外的函数整合进main , 就没有错误了....这是什么原因阿 ??是不是作用域的问题阿??

论坛徽章:
0
4 [报告]
发表于 2010-09-10 23:14 |只看该作者
你的main函数里,sentry这个指针是个野指针,没有赋过值,所以到了回调函数里,指针指向的buffer和entry,都可能会有问题

论坛徽章:
0
5 [报告]
发表于 2010-10-07 16:52 |只看该作者
回复 1# warmb2009

我回复了。

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
6 [报告]
发表于 2010-11-13 00:33 |只看该作者
回复 3# warmb2009


    将所有回调之外的函数整合近main,那creat_text这个函数你是怎么整合的?
    是在main中直接给 strentry的buffer成员赋值吧:
  1. strentry->buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
复制代码
这样当然没问题了,因为 strentry的成员buffer正确赋值了,以后用才不会出问题。而当你把 TextBuffer作为一个参数的时候,
在函数体内部怎么折腾这个参数都不影响函数之外,因为c语言是参数传递机制是值调用,这些值被放在被调用函数的形参的内存位置上(就是栈中)。
原来的变量还在那儿,没有被修改。

这都是c语言基础的东西。lz以前不是搞c的吗?搞java的?java对于不是基本类型的参数采用的是引用调用

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
7 [报告]
发表于 2010-11-13 00:37 |只看该作者
晕,我哪个回复怎么成2楼了?时间也不对了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP