2014-05-16 44 views
0

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

OUTPUT按压按钮15

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

OUTPUT按压按钮11

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

OUTPUT按压按钮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; 

和宣布,以主

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); 
    } 
} 
+0

我不知道为什么'str = malloc()'在这里被注释掉了。一旦小部件被销毁,指针将变为无效 –

+0

也是您的问题的主要描述(“当我添加另一个元素时,所有元素都消失了”)不是通过输出来判断:) –

回答

1

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

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

再有就是你的名单上环是一种非常低效的方式进行循环上链表本身的问题:

你问名单及其在每次迭代长度,这意味着迭代在每个时间列表;那么你使用g_list_nth_data()它将迭代列表直到它到达索引。一个双向链表是而不是一个数组,但是你使用前者,因为它是后者。遍历列表的正确方法是:

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

    // ... 
} 

为你的C语言编程的质量和款式方面注意事项:在不混合小写(botonelementos)和大写(WIDGETSLISTA)这样(坚持一个案例),并且你正在投入很多(gpointer是一个到void *的类型定义,并由C隐式转换)。

尽管如此,尽管如此,我仍然不明白这个问题,因为您没有给出足够的上下文以获得准确的答复。看起来你并不熟悉C语言,这让我认为你应该先用更高级的语言来使用GTK +,然后再试着使用C API。