gpt4 book ai didi

c - GList 问题 (GTK+,C)

转载 作者:行者123 更新时间:2023-11-30 15:33:27 25 4
gpt4 key购买 nike

我在将字符串保存到 glist 时遇到了很多麻烦。当我添加一个新字符串时,所有以前的元素都会消失,当我用“FOR”打印整个列表时,它只出现我添加的最后一个元素,在列表中的其他空格中只是垃圾,如下所示:

按按钮 15 输出

guardo el elemento:"15"
numero: "15"

按按钮 11 输出

guardo el elemento:"11"
numero: ""
numero: "11"

按按钮 10 输出

guardo el elemento:"10" 
numero: ""
numero: ""
numero: "10"

输出按下按钮 6

guardo el elemento:"6"
numero: ""
numero: ""
numero: "0�"
numero: "6"

我的列表在下一个结构中声明

typedef struct widgets {
...
GList *LISTA;

}WIDGETS;

并在main中初始化

gint main(gint argc,gchar *argv[])
{
...
WIDGETS *boton;
// 1.- Inicializar el ambiente
gtk_init(&argc, &argv);
boton = malloc(sizeof(WIDGETS));
boton->tipojuego=1;
boton->numMov=0;
boton->bandera=2;
g_timeout_add(1000,tiempo,boton);
boton->LISTA=NULL;

...
}

保存并打印列表元素的函数是(“elementos”指向与boton相同的函数):

void movimientos(GtkWidget *widget,gpointer info)
{
WIDGETS *elementos=(WIDGETS*)info;

gchar *str;
gpointer infor;
gint i;

//str=malloc(3*sizeof(char));
str=gtk_widget_get_name(widget);
g_print("guardo el elemento:\"%s\" \n",str);

elementos->LISTA=g_list_append(elementos->LISTA, str);
// g_print("Ya se guardo %s",(gchar *)g_list_last(elementos->LISTA)->data);

for(i=0;i<g_list_length(elementos->LISTA);i++)
{
infor=g_list_nth_data(elementos->LISTA,i);

str=(gchar *)infor;
g_print("\nnumero: \"%s\"",str);
}
}

最佳答案

你不应该使用malloc使用 GLib:使用 g_new()g_new0() 。你还应该初始化你的 boton首先是结构,特别是考虑到您将其传递给其他函数;不要将初始化与赋值和函数调用交错。

主要问题是gtk_widget_get_name()返回一个常量字符串,因此如果小部件消失,返回的字符串将包含垃圾。您需要连接到 GtkWidget::destroy发出信号并从列表中删除该元素,否则您必须复制 gtk_widget_get_name() 返回的字符串在将其添加到列表之前(然后记住释放列表的内容以及列表)。

还有一个问题是,在列表上循环是一种非常低效的 GList 循环方式:

您在每次迭代时询问列表的长度,这意味着每次都会迭代列表;那么你使用 g_list_nth_data()它将迭代列表直到到达索引。双向链表不是数组,但您使用前者就像后者一样。迭代列表的正确方法是:

GList *l = elementos->LISTA;
for (l = list; l != NULL; l = l->next) {
const char *str = l->data;

// ...
}

作为关于 C 编程质量和风格的旁注:不要以这种方式混合小写字母( botonelementos )和大写字母( WIDGETSLISTA )(坚持使用一种case),并且您的转换方式太多( gpointervoid * 的 typedef 并由 C 隐式转换)。

尽管如此,我仍然无法理解问题所在,因为您没有提供足够的上下文来进行准确的答复。看来您不太熟悉 C,这让我认为您应该在尝试使用 C API 之前将 GTK+ 与更高级的语言一起使用。

关于c - GList 问题 (GTK+,C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23701934/

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