Je fais mes premiers pas avec la glib après avoir un peu commencé à étudier GTK+.
Et j'ai quelques questions formelles et de syntaxe à poser que je vais illustrer au travers d'un exemple de programme simple pêché dans un bouquin.
1/ g_malloc, malloc ou g_try_malloc ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 #include <glib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int age; char *nom; } personne_type; int compare(personne_type *P1, personne_type *P2) { if (P1->age > P2->age) return 1; else if (P1->age == P2->age) { if (P1->nom > P2->nom) return 1; else return -1; } else return -1; } int main (void) { GSList *liste = NULL; personne_type *personne; personne = g_malloc(sizeof(personne_type)); personne->age = 15; personne->nom = "Jacques"; liste = g_slist_insert_sorted(liste, personne, (GCompareFunc)compare); personne = g_malloc(sizeof(personne_type)); personne->age = 20; /* personne->nom = "Paul";*/ personne->nom = malloc(5); strcpy(personne->nom, "Paul"); liste = g_slist_insert_sorted(liste, personne, (GCompareFunc)compare); personne = g_malloc(sizeof(personne_type)); personne->age = 15; personne->nom = "Pierre"; liste = g_slist_insert_sorted(liste, personne, (GCompareFunc)compare); printf("1 : %s, 2 : %s, 3 : %s\n", ((personne_type *)(liste->data))->nom, ((personne_type *)(liste->next->data))->nom, ((personne_type *)(liste->next->next->data))->nom); g_slist_free(liste); return 0; }
a/ Pourquoi utiliser g_malloc plutôt que malloc alors que j'ai lu dans la doc qu'en cas d'échec, elle ne renvoie pas NULL comme malloc mais... plante le programme ?!
Est-ce qu'il n'ya pas une régression à utiliser g_malloc à ce niveau ?
b/ Pourquoi alors éventuellement utiliser g_try_malloc qui semble avoir le, même comportement que malloc ?
2/ g_slist_free ?
g_slist_free est sensée libérer toute la mémoire de la liste y compris les allocations nécessaires au membre "char *nom" de la structure "type_personne" ?
Y compris quand j'alloue explicitement avec malloc pour Paul ?
3/ Comportement interne en cas d'échec de malloc ?
D'une façon générale, quel est le comportement au sein de la glib en cas d'échec d'allocation mémoire ?
Le programme plante ? Comportement indéterminé ? Autre ? La doc ne dit rien à ce sujet.
Je préférerais indiquer l'erreur à l'utilisateur dans l'interface graphique et terminer proprement !
4/ syntaxe de GList* g_list_find(GList *list, gconstpointer data)
a/ Syntaxe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 GList *recherche = NULL; guint motif = 15; recherche = g_list_find (liste, motif);
A la compilation, ça plante sur les deux warnings suivants, quel est le problème ?
warning: passing argument 1 of 'g_list_find' from incompatible pointer type
warning: passing argument 2 of 'g_list_find' makes pointer from integer without a cast
b/ Fonctionnement ?
De toute façon, je ne comprends pas le fonctionnement de g_list_find. D'autant moins que je ne vois pas sur quel membre de la structure il est sensé effectuer la recherche vu qu'on ne le lui dit indique pas. Et d'autre part, il se trouve que la valeur "15" correspond à deux résultats possibles pour l'âge, quel arbitrage fait-il alors ?
5/ syntaxe de gpointer g_list_nth_data(GList *list, guint n)
Même chose, je ne comprends pas la syntaxe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part personne = g_list_nth_data (liste, 1);
warning: passing argument 1 of 'g_list_nth_data' from incompatible pointer type
6/ comportement étrange
Dans mes tests, entre chaque insertion dans la liste, j'avais rajouté un free(personne) juste pour voir.
Il me sort alors comme résultat surprenant... "1 : Pierre, 2 : Pierre, 3 : Pierre" !!!
----------------------
Pardon pour ce sujet un peu long et toutes ces questions mais je suis dubitatif quant à la glib pour le moment...et du coup j'ai des doutes pour GTK+ également. Mon enthousiasme premier retombe un peu.
Partager