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 :

quelques questions concernant g_free, g_malloc


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut quelques questions concernant g_free, g_malloc
    Bonsoir,

    je voudrais avoir des précisions sur l'utilisation et l'utilité des fonctions g_free et g_malloc.
    est-ce que ces deux fonctions peuvent s'utiliser ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    GtkWidget **monWidget;
     
    monWidget = g_malloc(sizeof(GtkWidget **));
    for(i = 0; i < 10; i++){
    monWidget[i] = g_malloc(sizeof(GtkWidget *));
    }
     
    //Plus loin dans le code
     
    for(i = 0; i < 10; i++){
    g_free(monWidget[i]);
    }
    g_free(monWidget);
    Merci de vos réponses

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Oui, elles s'utilisent exactement de la même façon que les fonctions standards free et malloc, ce sont que des wrappers rien de plus
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut
    si l'utilisation est exactement la même, le problème devant lequel je suis doit concerner les types des variables que je modifie. Je m'explique :
    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
     
    gint i;
    GtkTextBuffer **textbuf; //tableau de GtkTextBuffer alloué dynamiquement
    GtkTextBuffer **tmp; //tableau dans lequel on va copier textbuf pour ajouter un nouvel élément à textbuf
     
    // mettons que je veuille en allouer 5 
    textbuf = g_malloc(sizeof(GtkTextBuffer **) * 5);
     
    for(i = 0; i < 5; i++){
    textbuf[i] = g_malloc(sizeof(GtkTextBuffer *));
    }
     
    //Fin de l'allocation
    // ....
     
    //Début de la copie dans tmp
    tmp = g_malloc(sizeof(GtkTextBuffer **) * 5);
     
    for(i = 0; i < 5; i++){
    tmp[i] = g_malloc(sizeof(GtkTextBuffer *));
    tmp[i] = textbuf[i];
     
    g_free(textbuf[i]);
    }
     
    g_free(textbuf);
     
    // Allocation d"un 6 eme élément
    textbuf = g_malloc(sizeof(GtkTextBuffer **) * 6);
     
    for(i = 0; i < 6; i++){
    textbuf[i] = g_malloc(sizeof(GtkTextBuffer *));
    textbuf[i] = tmp[i];
    g_free(tmp[i]);
    }
     
    g_free(tmp);
     
    //bla bla bla ... :)
    Ce code produit une erreur lorsque j'essaie de faire les g_free(textbuf[i]) dans la boucle de recopie du contenu de textbuf dans tmp (la 2eme boucle ) et je ne comprends pas pourquoi
    Pourriez-vous m'éclairer ?

    Merci pour vos réponses

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ce qu'il y'a, c'est qu'on ne créé pas un GtkTextBuffer de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textbuf[i] = g_malloc(sizeof(GtkTextBuffer *));
    Chaque widget possède son propre constructeur, c'est pas pour faire beau qu'ils existent ou pour faire style !

    Le mieux serait que tu post le code complet et compilable (réduit au minimum cernant le problème si le code est trop gros) car là j'avoue franchement ne pas voir de problème mis à part ce que je dit ci-dessus
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut
    Citation Envoyé par Franck.H
    Ce qu'il y'a, c'est qu'on ne créé pas un GtkTextBuffer de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textbuf[i] = g_malloc(sizeof(GtkTextBuffer *));
    Chaque widget possède son propre constructeur, c'est pas pour faire beau qu'ils existent ou pour faire style !

    Je suis un boulet.., merci


    Citation Envoyé par Franck.H
    Le mieux serait que tu post le code complet et compilable (réduit au minimum cernant le problème si le code est trop gros) car là j'avoue franchement ne pas voir de problème mis à part ce que je dit ci-dessus
    Je vais essayer ce que tu m'as dit, je reposterais si besoin

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut
    Bonjour,

    J'explique ce que je cherche à faire :
    je voudrais être capable d'allouer dynamiquement un nouveau GtkTextView lorsque l'utilisateur clique sur un bouton. En gros, il faut que la fonction ci-dessous ajoute un pTextView et un pScrolled (respectivement) aux variables **pTextView et **pScrolled.
    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
    62
    63
    64
     
    void ma_fonction(gint nb, gpointer data){
    gint i;
    win *pApp = NULL;
     
    GtkWidget **tScroll;
    GtkWidget **tView;
     
    //le gint nb passé en parametre est le nombre d'objets contenus dans **pTextView et //**pScrolled
    //pApp est le pointeur sur la structure qui contient 
    //les déclarations de **pTextView et **pScrolled
    pApp = (win *) data;
     
     
    tView = g_malloc(sizeof(GtkWidget **) * nb);
    tScroll = g_malloc(sizeof(GtkWidget **) * nb);
     
        for(i = 0; i < nb; i++){
            if(GTK_IS_TEXT_VIEW(pApp->pTextView[i])){
                tView[i] = gtk_text_view_new();
                tView[i] = pApp->pTextView[i];
     
                /* Tous les g_free font planter l'application */
                g_free(pApp->pTextView[i]);
                }
     
            if(GTK_IS_SCROLLED_WINDOW(pApp->pScrolled[i])){
                tScroll[i] = gtk_scrolled_window_new(NULL, NULL);
                tScroll[i] = pApp->pScrolled[i];
     
                g_free(pApp->pScrolled[i]);
                }
            }
     
            g_free(pApp->pTextView);
            pApp->pTextView = NULL;
            pApp->pTextView = g_malloc(sizeof(GtkWidget **) * (nb + 1));
     
            g_free(pApp->pScrolled);
            pApp->pScrolled = NULL;
            pApp->pScrolled = g_malloc(sizeof(GtkWidget **) * (nb + 1));
     
        for(i = 0; i < nb; i++){
            if(GTK_IS_TEXT_VIEW(tView[i])){
                pApp->pTextView[i] = gtk_text_view_new();
                pApp->pTextView[i] = tView[i];
     
                g_free(tView[i]);
                }
     
            if(GTK_IS_SCROLLED_WINDOW(tScroll[i])){
                pApp->pScrolled[i] = gtk_scrolled_window_new(NULL, NULL);
                pApp->pScrolled[i] = tScroll[i];
                g_free(tScroll[i]);
                }
            }
     
        g_free(tView);
        g_free(tScroll);
        tView = NULL;
        tScroll = NULL;
        }
     
    }
    Merci de vos réponses

    EDIT : l'erreur dans la console est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free() :invalid pointer: 0X80xxxxxxx <-- adresse mémoire
    //ensuite la backtrace que je ne sais pas décodé ^^

Discussions similaires

  1. Quelques questions concernant le tuto Java - TP Calculatrice
    Par klgui4 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 11/04/2012, 11h36
  2. Quelques questions concernant un Userform
    Par rickgoz dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 31/10/2008, 16h51
  3. Quelques questions concernant un exo de BD
    Par dudule65 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/01/2008, 14h25
  4. Quelques questions concernant PDCurses
    Par Electroniktor dans le forum C
    Réponses: 3
    Dernier message: 16/09/2007, 16h44
  5. [Kylix] Quelques questions
    Par onet dans le forum EDI
    Réponses: 4
    Dernier message: 23/11/2005, 10h53

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