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++

  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 : 47
    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 : 47
    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é ^^

  7. #7
    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 : 47
    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
    Ok donc tu veux un tableau de widgets c'est bien ca ? Si oui et si c'est bien ce que j'ai compris, tu peux faire ainsi (si tu veux un tableau dynamique):

    1.- On alloue le tableau;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GtkWidget ** wid = NULL;
    ...
    wid = g_malloc (n * sizeof (* wid));
     
    if (wid == NULL)
    {
       /* Erreur d'allocation */
       ...
    }
    Ensuite, tu peux créer tes widgets à dedans mais en utilisant les constructeurs de ces widgets soit, si par exemple tu veux créer un widget de type GtkButton sur l'index 0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wid[0] = gtk_button_new ();
    Voilà mais tu ne peux pas créer de widgets par une simple allocation dynamique, programmer avec GTK+ c'est comme programmer en C pur, on peut pas le faire en jouant aux devinettes, il y'a des règles précises à respecter pour bien faire les choses

    Sinon au pire, passe le code complet (et compilable) réduit au minimum (si trop gros) cernant le problème que je test chez moi.
    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 !

  8. #8
    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 : 47
    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
    Citation Envoyé par bit_o
    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é ^^
    Et comment est créé le widget:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_free(pApp->pTextView[i]);
    ?
    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 !

  9. #9
    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
    pApp->pTextView[i] est créé par l'appel à la fonction gtk_text_view_new() à un autre endroit de mon programme

    ce que je cherche à faire avec l'algo que j'ai mis au dessus, c'est ajouter un nouvel emplacement dans mon tableau **pTextView et dans **pScrolled.
    est-ce que mon algorithme est faux ?

  10. #10
    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 : 47
    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
    Citation Envoyé par bit_o
    pApp->pTextView[i] est créé par l'appel à la fonction gtk_text_view_new() à un autre endroit de mon programme
    Ok donc évite un g_free là dessus !

    Citation Envoyé par bit_o
    ce que je cherche à faire avec l'algo que j'ai mis au dessus, c'est ajouter un nouvel emplacement dans mon tableau **pTextView et dans **pScrolled.
    est-ce que mon algorithme est faux ?
    Pour agrandir ou rétrécir ton tableau, il te faut utiliser la fonction g_realloc ! L'utilisation reste la même qu'avec realloc et donc les données précédentes sont conservées !
    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 !

  11. #11
    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
    je n'ai jamais utilisé realloc() en fait..
    est-ce que je dois l'utiliser comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_realloc (pApp->pTextView, sizeof(GtkWidget *));
    EDIT : je viens de trouver comment faire ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pApp->pTextView = g_realloc(pApp->pTextView , sizeof(GtkWidget *));
    Merci Franck

  12. #12
    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 : 47
    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
    Citation Envoyé par bit_o
    je n'ai jamais utilisé realloc() en fait..
    est-ce que je dois l'utiliser comme ça ?
    Ok pas de problème je te l'explique. Si pTextView est un pointeur de pointeur, soit:
    (pour l'exemple hein)

    Alors tu peux faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GtkWidget ** tmp = g_realloc (pApp->pTextView, n * sizeof (* pApp->pTextView));
     
    if (tmp != NULL)
    {
       /* On met a jour le tableau : */
       pApp->pTextView = tmp;
    }
    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 !

  13. #13
    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 : 47
    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
    Citation Envoyé par bit_o
    EDIT : je viens de trouver comment faire ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pApp->pTextView = g_realloc(pApp->pTextView , sizeof(GtkWidget *));
    Il ne faut pas utiliser g_realloc de cette manière, voir un petit cours sur la bonne utilisation de realloc: http://emmanuel-delahaye.developpez....es.htm#realloc Je t'ai montré juste sur le post au-dessus comment faire "correctement"
    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 !

  14. #14
    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
    ok merci

  15. #15
    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'ai à nouveau un problème avec l'utilisation de la fonction g_realloc(), elle ne marche plus
    je m'explique : hier la fonction dans laquelle j'utilise la fonction g_realloc marchait tres bien, et aujourd'hui elle ne marche plus. L'application est compilée sans erreur (ni warnings), seulement à l'exécution j'ai un joli Segmentation fault qui m'indique que la ligne ou je fais l'allocation ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tmp = g_realloc(pApp->pTextView, nb * sizeof (* pApp->pTextView));
    cette ligne la ne marche pas. Or nb est le nombre d'onglets ouverts que je récupère avec la fonction gtk_notebook_get_n_pages(monNotebook) (résultat que je teste), donc pas d'erreur de ce coté la.

    D'ailleurs je me pose une question, est-ce que je peux faire un realloc() sur une variable qui n'a pas été allouée avec malloc() ?

    Merci de vos réponses

  16. #16
    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 : 47
    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
    Citation Envoyé par bit_o
    D'ailleurs je me pose une question, est-ce que je peux faire un realloc() sur une variable qui n'a pas été allouée avec malloc() ?
    Oui, en fait si tu passes un pointeur NULL à realloc, la fonction agit comme un malloc tout simplement !

    Pour ton problème, bin le mieux serait encore que tu donnes le code complet que je puisse tester ca chez moi.
    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 !

  17. #17
    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
    merci pour le realloc()

    poster tout mon code c'est bien trop long. Je vais faire une trace de mes algos et je finirais bien par trouver ou ça plante ^^

  18. #18
    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
    je ne comprends pas ce qu'il se passe. Quoique je fasse j'ai l'impression que les fonctions realloc() et malloc() ne produisent pas les effets que j'espère. Je vous mets la fonction que j'utilise :
    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
     
    //===================
    //déclaration des mes widgets dans la structure :
    // GtkWidget **pTextView;
    // GtkWidget **pScrolled;
    //===================
     
    int main(int argc, char *argv[]){
     
     //Version raccourcie, on suppose que toutes les allocations se passent bien ;) 
     pApp->pTextView = g_malloc(sizeof(* pApp->pTextView));
     pApp->pScrolled = g_malloc(sizeof(* pApp->pScrolled));
     creation(NULL, (gpointer) pApp);
     
    }
     
    void        creation(GtkWidget *widget, gpointer data){
        win             *pApp = NULL;
        gint            nb = 0;
        GtkWidget       **tmp;
        GtkWidget       **tmp2;
     
        pApp = (win *) data;
     
        nb = gtk_notebook_get_n_pages(GTK_NOTEBOOK(pApp->pNotebook));
     
        nb == -1 ? 0 : nb;
     
        /* ajout d'un nouvel élément */
        tmp = g_realloc(pApp->pTextView, sizeof(* pApp->pTextView) * (nb + 1));
        if(tmp != NULL)
            pApp->pTextView = tmp;
     
        tmp2 = g_realloc(pApp->pScrolled, sizeof(* pApp->pScrolled) * (nb + 1));
        if(tmp2 != NULL)
           pApp->pScrolled = tmp2;
     
        pApp->pScrolled[nb] = gtk_scrolled_window_new(NULL, NULL);
    Le code bloque sur la création du pScrolled[nb] (la derniere instruction)

  19. #19
    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 : 47
    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
    Bon j'ai testé comme j'ai pû avec ce que j'avais mais pas de problèmes chez moi mais apparement pas de soucis, d'ailleurs je ne vois pas pour quelle raison il y en aurait !

    D'abord une question ... A quoi te sert cette expression ?
    Telle qu'elle est présentée là elle ne sert strictement à rien:
    /home/franhec/Documents/Programmation/CodesTests/GTK+/main.c:26: warning: statement with no effect
    :: === Build finished: 0 errors, 1 warnings ===
    Si c'est pour déterminer le nombre de pages, il faut savoir que la fonction gtk_notebook_get_n_pages renvoie 0 s'il n'y à pas de pages donc je vois pas bien ce que viens faire un -1 dans l'expression Tu n'as même pas besoin de tester la valeur de nb car s'il n'y pas de d'onglets, tu créé d'office avec ton code qui suit, les widgets pour le premier onglet.


    Voici mon code de test:
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    #include <gtk/gtk.h>
    #include <glib.h>
    #include <glib/gprintf.h>
     
     
    typedef struct
    {
       GtkWidget *  pNotebook;
       GtkWidget ** pScrolled;
    }
    win;
     
     
    static void creation (GtkWidget * widget, gpointer data)
    {
       win             *pApp = NULL;
       gint            nb = 0;
       GtkWidget       **tmp2 = NULL;
     
       pApp = data;
     
     
       nb = gtk_notebook_get_n_pages (GTK_NOTEBOOK (pApp->pNotebook));
     
     
       /* ajout d'un nouvel élément */
       tmp2 = g_realloc (pApp->pScrolled, sizeof (* pApp->pScrolled) * (nb + 1));
       if (tmp2 != NULL)
       {
          g_printf ("Re-allocation reussie !\n");
          pApp->pScrolled = tmp2;
       }
     
     
       pApp->pScrolled[nb] = gtk_scrolled_window_new (NULL, NULL);
       if (pApp->pScrolled[nb] != NULL)
       {
          g_printf ("Creation reussie !\n");
       }
     
       (void) widget;
    }
     
     
    int main (int argc, char ** argv)
    {
       GtkWidget * p_win       = NULL;
       GtkWidget * p_vbox      = NULL;
     
     
       gtk_init (& argc, & argv);
     
     
       p_win = gtk_window_new           (GTK_WINDOW_TOPLEVEL);
       gtk_window_set_default_size      (GTK_WINDOW (p_win), 200, 200);
       gtk_container_set_border_width   (GTK_CONTAINER (p_win), 5);
       gtk_window_set_position          (GTK_WINDOW (p_win), GTK_WIN_POS_CENTER);
       g_signal_connect                 (p_win, "destroy", gtk_main_quit, NULL);
     
     
       p_vbox = gtk_vbox_new (FALSE, 5);
       gtk_container_add (GTK_CONTAINER (p_win), p_vbox);
     
     
       /* ----- */
     
       win * pApp = g_malloc (sizeof (* pApp));
     
       if (pApp != NULL)
       {
          pApp->pNotebook = gtk_notebook_new ();
          gtk_box_pack_start (GTK_BOX (p_vbox), pApp->pNotebook, TRUE, TRUE, 0);
     
          pApp->pScrolled = g_malloc (sizeof (* pApp->pScrolled));
     
          if (pApp->pScrolled != NULL)
          {
             g_printf ("Allocation reussie !\n");
             pApp->pScrolled[0] = gtk_scrolled_window_new(NULL, NULL);
          }
     
          creation (NULL, (gpointer) pApp);
       }
     
       /* ----- */
     
     
       gtk_widget_show_all (p_win);
       gtk_main ();
     
     
       return 0;
    }

    Voilà, je ne peut faire plus sans avoir ton code complet et le tester chez moi, si des fois ont le demande le code, c'est pas pour rien
    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 !

  20. #20
    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
    je croyais que ça renvoyait -1 si le notebook ne contient aucune page... C'est la raison de mon test.. Je vais tester le reste

    En tout cas, merci beaucoup Franck d'avoir pris le temps de tester tout ça

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