Forum Programmation.c glib: problem avec GArray

Posté par  .
Étiquettes : aucune
0
22
oct.
2004
Bonjour.

Voila, je suis nouveau sur glib, et c'est tellement bien foutu que ca
rend le C utilisable ! Mais tout n'est pas rose, et je n'arrive pas a
affecter une valeur dans un tableau.

Voila ce que je veux faire: un tableau de listes, genre:
0: "toto", "tata", "titi"
1: "popo", "papa", "pipi"
2:.....

(en fait de "toto" "tata", j'ai des pointeurs vers un type GaloisNode que j'ai defini.)

Donc j'ai une variable buckets:

GArray* buckets = g_array_new(FALSE, FALSE, sizeof(gpointer));
g_array_set_size(buckets, laBonneTaille);

Puis je me met a inserer des elements dans mes listes. Pour ca je me suis fait une petite fonction

GArray*
bucket_insert(GArray* buckets,
GaloisNode* node,
guint index){
GList* currentBucket = g_array_index (buckets, GList*, index);
currentBucket = g_list_append(currentBucket, node);
g_array_insert_val(buckets, index, currentBucket);
}

* Ligne 1: je recupere la GList existante a la position "index"
* Ligne 2: j'ajoute "node" a la GList
* Ligne 3: je remet la GList a sa place ; je sais que g_list_append modifie la liste qu'il prend en entree, mais si on avait NULL (insertion du premier element) ca ne nous aide pas beaucoup.

Voila, maintenant le probleme c'est qu'a chaque fois que je rentre dans cette fonction, la liste que je recupere au final a l'air vide. Et une fois que mon "remplissage" de listes est fini, je me retrouve avec au plus un element dans chaque liste.

Il semble donc que l'insertion marche, mais qu'elle vide la liste...
  • # ah en fait

    Posté par  . Évalué à 2.

    J'ai peut-etre trouve tout seul, il se pourrait que g_array_insert_val insere effectivement la valeur, et decale tout au lieu de remplacer le precedent comme je pensais.
    • [^] # Re: ah en fait

      Posté par  . Évalué à 2.

      Ah oui, c'etait bien ca. J'ai ajoute cette ligne:

      g_array_remove_index(buckets, index);

      pour virer l'index avant de le reinserer. C'est porc, mais j'ai pas trouve mieux en utilisant l'interface de GArray.
      • [^] # Re: ah en fait

        Posté par  . Évalué à 2.

        La fonction g_array_insert_val(buckets, index, currentBucket); renvoie le pointeur de départ de ton tableau. A chaque fois que tu insères un nouvel élément, le pointeur de départ change. C'est le même principe avec les GList.
        La documentation dit :

        GArray* g_array_insert_vals (GArray *array,
        guint index_,
        gconstpointer data,
        guint len);

        Inserts len elements into a GArray at the given index.
        array : a GArray.
        index_ : the index to place the elements at.
        data : a pointer to the elements to insert.
        len : the number of elements to insert.
        Returns : the GArray.

        En plus, il n'y a pas d'instruction return dans ta fonction ?
        Donc en résumant :

        GArray *bucket_insert(GArray* buckets, GaloisNode* node, guint index)
        {
        GList* currentBucket = g_array_index (buckets, GList*, index);
        currentBucket = g_list_append(currentBucket, node);
        buckets=g_array_insert_val(buckets, index, currentBucket);
        return buckets;
        }

        Ca devrait te permettre de récupérer le pointeur de départ de ton tableau.

        PS: je me permets de faire un peu de pub. Il existe un site ainsi qu'un forum sur l'utilisation des librairies GTK ( dont la Glib fait partie ) :
        site : http://www.gtk-fr.org(...)
        forum : http://forums.apinc.org(...)
        • [^] # Re: ah en fait

          Posté par  . Évalué à 2.

          Merci ; en fait le probleme etait que j'avais mal compris la fonction insert. En gros, j'avais ca:

          0: toto
          1: tata
          2: titi

          ...Et je voulais recuperer 1: tata pour lui ajouter titi et le remettre en position 1. Manque de bol, vu que ca insert mais ne remplace pas, ca donnait ca:

          0: toto
          1: tata titi
          2: tata
          3: titi

          au lieu de ca:

          0: toto
          1: tata titi
          2: titi

          D'ou la necessite de supprimer l'entree 1 avant de reinserer... Merci aussi pour le lien vers le forum et le site !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.