代码之家  ›  专栏  ›  技术社区  ›  Hanlon

将数组传递给函数-不同的值-Segfault

  •  0
  • Hanlon  · 技术社区  · 6 年前

    我有以下代码:

    gpointer w[3];
    GtkWidget *menu_item = gtk_menu_item_new();
    w[0] = menu_item;
    menu_item = gtk_menu_item_new();
    w[1] = menu_item;
    GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
    w[2] = buffer;
    

    到现在为止一切都很好。现在连接一个信号:

    g_signal_connect(w[0], "activate", G_CALLBACK(runner), w);
    

    runner 函数声明为:

    void runner(gpointer root, gpointer w[]);
    

    测试 w 进入前数组 而在它里面,它们(值)是不同的。我需要它们是一样的。我怎样才能做到这一点,为什么它们不完全相同?同时,也会发生故障。


    我创建了一个小程序,它是原始程序的一部分,应该可以重新创建问题发生的条件。奇怪的是,它运行良好。
    #include <gtk/gtk.h>
    
    void carry(gpointer root, gpointer a[])
    {
            g_print("\n");                                                              
            g_print("%d\n", root);
            g_print("%d\n", a[0]);                                                      
            g_print("%d\n", a[1]);
            g_print("%d\n", a[2]);                                                      
    }
    
    int main(int argc, char **argv)
    {
            gtk_init(&argc, &argv);                                                     
    
            GtkWidget *menu_item;
            GtkTextBuffer *buffer;
            gpointer abc[3];
    
            menu_item = gtk_menu_item_new();
            abc[0] = menu_item;
            g_print("%d\t%d\n", menu_item, abc[0]);
            menu_item = gtk_menu_item_new();
            abc[1] = menu_item;
            g_print("%d\t%d\n", menu_item, abc[1]);                                     
            buffer = gtk_text_buffer_new(NULL);                                         
            abc[2] = buffer;                                                            
            g_print("%d\t%d\n", buffer, abc[2]);
    
            g_signal_connect(abc[2], "modified-changed", G_CALLBACK(carry), abc);       
    
            gtk_text_buffer_set_modified(abc[2], TRUE);
    
            gtk_main();
    
            return 0;
    }
    

    也就是说还有其他问题。我现在就试试别的办法,比如评论台词,只留下相关的台词。


    g_print 在呼叫者和被呼叫者中。

    这是一个输出:

    1162863440  1162863440
    1162864736  1162864736
    1163320992  1163320992
    
    1162863440
    -2
    1162668992
    973486176
    

    前三行将原始值与其在数组中的副本进行比较(从 g_print("%d\t%d\n", menu_item, abc[0]); root 第一个参数始终具有正确的值。所以这没问题。 abc[0] 在被叫方 总是 有价值的 -2 . 说真的,每次我运行程序 abc[1] abc[2] )总是有一些垃圾随机值,但是每次我运行程序时它们都会改变 abc[0] .

    我希望这将有助于诊断和解决问题。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Hanlon    6 年前

    我两个都试过了 abc[0] abc 通常通过函数( func(arg0, arg1, ...) 而不是使用 g_signal_connect() )以及 .

    g_signal_connect 正在扰乱我的价值观。它会因为一些未知的原因改变它们。

    我想我得用一个结构。

        2
  •  0
  •   liberforce    6 年前

    你不应该使用 gpointer 到处都是。A G指针 void * ,所以您几乎禁用了编译器可以为您执行的所有类型检查。使用 GtkWidget * 相反,使用 G_OBJECT() GTK_TEXT_BUFFER()

    您还应该使用类型化回调参数,因为它们出现在每个信号的文档中。例如 activate

    void
    user_function (GtkMenuItem *menuitem,
                   gpointer     user_data)
    

    如果要在用户数据字段中传递多个项,请传递指向结构的指针或指针,而不是指针数组。

    如果你有一个segfault,那么就用一个调试器来检查问题出在哪里。