gpt4 book ai didi

c - GTK+/C : Passing data through g_signal_connect changes the data

转载 作者:行者123 更新时间:2023-11-30 16:28:44 30 4
gpt4 key购买 nike

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

最佳答案

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

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

BtnLoc[counter] = x;

是:

*BtnLoc[counter] = x;

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

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

编辑:

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

关于c - GTK+/C : Passing data through g_signal_connect changes the data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52245696/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com