2014-05-16 73 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。