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

问题描述 投票:0回答:1

我看过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

c arrays pointers gtk gtk3
1个回答
0
投票

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

所以我想你想要的而不是

BtnLoc[counter] = x;

是:

*BtnLoc[counter] = x;

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

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

编辑:

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

© www.soinside.com 2019 - 2024. All rights reserved.