GTK + / C:通过g_signal_connect传递数据会更改数据

时间:2018-09-09 14:55:10

标签: c arrays pointers gtk gtk3

我看过GTK+ g_pointer_connect passing data incorrectly,但是即使尝试按照人们的指示去做,我的问题仍然存在。

我需要做的是从数组数组中传递一个数组。

声明此数组的代码在这里

    int **BtnLoc = malloc(sizeof(int*) * 9);
    for (int i = 0; i < 9; i++) {
        BtnLoc[i] = malloc(sizeof(*BtnLoc[i]) * 3);
     }

使用此代码的是这个

unsigned int counter = 0;
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        int x[2] = {i, j};
        BtnLoc[counter] = x;
        buttons[i][j] = gtk_button_new();
        gtk_table_attach_defaults(
                            GTK_TABLE(table),
                            buttons[i][j],
                            i, i+1, j, j+1
                        );
        g_signal_connect(
                        buttons[i][j],
                        "clicked",
                        G_CALLBACK(Toggled),
                        BtnLoc[counter]
                    );
        counter++;
    }
}

Toggled()函数中,它打印x[0]x[1],但不是完全是0、1或2和1,而是像-1924531234和24539这样的完整垃圾。

1 个答案:

答案 0 :(得分:0)

您的代码没有意义。首先声明一个9指针数组,该指针指向3个整数的数组,然后以完全不同的方式填充它。您要在告诉编译器的地方分配整数,该整数将存储指向整数的指针。

所以我想你想要什么而不是

BtnLoc[counter] = x;

是:

*BtnLoc[counter] = x;

这仍然存在问题:您创建了一个包含每个3个整数的数组数组,但是仅初始化了2个,因此第三个内存位置的内容未定义。

只需使用GLib中提供的动态数组类型(例如GArray或GptrArray)并避免这些问题,因为这通常会使代码更易于阅读。

编辑:

似乎是XY problem。您似乎想将按钮位置存储在数组中,但我不明白为什么要这样做。