IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Typage des données/manipulation des données


Sujet :

GTK+ avec C & C++

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Points : 25
    Points
    25
    Par défaut
    Très bien.
    En fait, la fonction g_ptr_array_foreach () passe automatiquement (en premier paramètre) à la fonction pointée chaque élément du tableau, c'est correct ? Ma question est pour bien comprendre : est-il possible ou non de pointer vers une fonction ayant 2 ou + paramètres dans la fonction g_ptr_array_foreach () ?

    Pour éviter d'avoir une callback par type à effacer, tu peux aussi passer la fonction à utiliser pour détruire la donnée en paramètre user_data.
    Très astucieux, merci.

  2. #22
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Dans la GFunc, le 1er paramètre (data) contient la valeur d'une des cases du GPtrArray, et ta fonction est appelée une fois pour chacun des paramètres. Le 2ème paramètre (user_data) est une donnée à toi qui peut être utile pour le traitement à effectuer. C'est celui que tu as renseigné dans l'appel à g_ptr_array_foreach.

  3. #23
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Points : 25
    Points
    25
    Par défaut
    Salut,

    Et pour la fonction g_ptr_array_remove, la mémoire occupée par l'élément retiré est-elle libérée par cette fonction ? Si non, comment retirer proprement un élément ?

  4. #24
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Non, tout simplement parce que c'est un tableau dynamique. Un tableau dynamique grandit quand on ajoute des éléments à l'intérieur. Cela signifie qu'il en crée un nouveau tableau plus grand, copie les données du tableau devenu trop petit, puis libère la mémoire de l'ancien tableau. Tout cela prend du temps.

    Quand tu supprimes un élément, il serait contre-productif de désallouer ton tableau pour en réallouer un plus petit. Au lieu de cela, tu ne fais que supprimer l'élément, et conserver en interne la taille réelle du tableau.

    La libération du tableau ne s'effectue que quand tu appelles g_ptr_array_free, avec le paramètre free_seg valant TRUE.

    Quant à g_ptr_array_remove, il enlève du tableau le pointeur de l'objet, c'est tout. C'est à toi d'appeler spécifiquement la méthode de libération sur ton objet après l'avoir retiré du GPtrArray si tu souhaites le détruire.

    Si tu souhaites que ce soit le GPtrArray qui gère la destuction des éléments quand tu les retires, alors tu peux utiliser la méthode que je t'ai donnée ou bien g_ptr_array_new_with_free_func (mais qui n'est disponible qu'à partir de la GLib 2.22).

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Février 2010
    Messages : 63
    Points : 25
    Points
    25
    Par défaut
    Ok, donc quand tu dis :
    Citation Envoyé par liberforce Voir le message
    Quand tu supprimes un élément, il serait contre-productif de désallouer ton tableau pour en réallouer un plus petit. Au lieu de cela, tu ne fais que supprimer l'élément, et conserver en interne la taille réelle du tableau.
    La valeur array->len est quand même mise à jour ? Puisque c'est cette valeur qui me permet de retrouver le nombre d'éléments dans mon tableau. Ça serait embêtant qu'il me compte les éléments que j'ai auparavant supprimé.

  6. #26
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Oui bien sûr, array->len est mise à jour.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/05/2014, 12h47
  2. Manipuler des TDateTime comme des entiers?
    Par toufou25 dans le forum C++Builder
    Réponses: 8
    Dernier message: 22/06/2006, 16h52
  3. Réponses: 1
    Dernier message: 27/11/2005, 15h30
  4. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 23h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo