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

C Discussion :

Pointeur de fonction


Sujet :

C

  1. #21
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Pour l'instant ça n'a effectivement pas réellement d'intérêt mais comme je l'avais dit précédemment (au tout début), c'est tiré d'un ouvrage "Maîtrise des algorithmes en C" écrit par Kyle Loudon qui utilise dans son ouvrage que des pointeurs de fonction.
    Donc comme j'aimerais bien utiliser son code et comprendre les mécanismes, il faut que je comprenne comment tout cela fonctionne.

    Ce que j'ai copié/collé c'est exactement ce qu'il y a dans l'ouvrage mais à chaque fois il n'y a pas d'exemple de "main" pour comprendre comment utiliser.

    Voilà la motivation de ce post.

  2. #22
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par AuraHxC
    Ce que j'ai copié/collé c'est exactement ce qu'il y a dans l'ouvrage mais à chaque fois il n'y a pas d'exemple de "main" pour comprendre comment utiliser.
    Si c'est vraiment un copié collé, tu peux jeter le livre. Le code est faux. (types incohérents).

  3. #23
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    ça fait quand même ch***, c'est un bouquin de chez O'reilly je pensais que c'était sérieux...
    Je vais regarder le code de nouveau sur le bouquin et je redis si c'est moi qui est fait une bêtise.

  4. #24
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Bon comme l'indentation des fichiers que le bouquin propose ne sont pas terrible, je peux te proposer l'adresse où l'on peut télécharger les sources comme ça si ça te dérange pas tu pourrais me donner ton avis.

    Pour les listes chaînées simple c'est les fichiers list.h et list.c.

    http://www.oreilly.fr/archives/algoc.zip

  5. #25
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    J'ai vite fait regardé le tuto sur le site developpez.com qui traite des pointeurs et il y a un petit truc sur les pointeurs de fonction.

    j'ai fait ce bout de code tout con mais ca permet de comprendre un peu le concept je pense.

    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
     
    #include <stdio.h>
     
    void add(int *a, int *b,int *result) {
        *result = *a+*b;
    }
     
    int main(void) {
        int a = 5;
        int b = 10;
        int result;
        void(*padd)(int*, int*,int*);
     
        padd = add;
        padd(&a,&b,&result);
     
        printf("resultat : %d\n",result);
     
        return 0;
    }

  6. #26
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Sinon Emmanuel, je viens de voir la critique sur developpez.com de mon ouvrage et il est plutôt bien noté donc c'est qu'il ne doit pas être aussi nul que ça, non ?

    J'attend de voir tes réactions sur le code que je t'ai donné en lien
    Enfin si ça te dérange pas bien entendu...

  7. #27
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    mmm moi j'aurais plutôt présenté comme ceci ton exemple :

    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
     
    #include <stdio.h>
     
    typedef struct {
       int a ;
       int b ;
       int result ;
    } MonData ;
     
     
    void add (void *Data) 
    {
       MonData *mdata = (MonData *)Data ;
     
        mdata->result = mdata->a + mdata->b;
    }
     
     
    void Fonction ( void MaFonction, void *Data )
    {
          MaFonction ( Data );
    }
     
    int main(void) {
        MonData Data ;
     
        Data.a = 5;
        Data.b = 10;
        Data.result = 0;
     
        Fonction ( add, (void *)&Data );
     
        printf("resultat : %d\n",Data.result);
     
        return 0;
    }
    Mais pour faire un code "éducatif", j'aurais fait la chose suivante :

    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 <stdio.h>
     
    typedef struct {
       int a ;
       int b ;
       int result ;
    } MonData ;
     
     
    typedef struct {
         int     Type ;
         void *AdrFct ;
         void *Data ;
    } Fct ;
     
    #define ADD  1
     
    #ifndef SUCCESS
    #define SUCCESS 0
    #define ERROR 1
    #endif
     
     
    static Fct *Fcts=NULL ;
    static int    NFcts=0 ;
     
    void add (void *Data) 
    {
       MonData *mdata = (MonData *)Data ;
     
        mdata->result = mdata->a + mdata->b;
    }
     
     
    int StockeFonction ( int Type, void *MaFct, void *Data )
    {
       Fct tmp =NULL ;
     
        if ( NFcts == 0 )
          {
              Fcts = calloc ( 1, sizeof(Fct) );
              if ( Fcts == NULL )
                 return ERROR ;
          }
        else
          {
             tmp = realloc ( Fcts, ((NFcts+1)*sizeof(Fct)) );
             if ( tmp == NULL )
               return ERROR ;
             Fcts = tmp ;
          }
     
        Fcts[NFcts].Adr = MaFct ;
        Fcts[NFcts].Type = Type ;
        Fcts[NFcts].Data = Data ;
        NFcts = NFcts + 1 ;
     
        return SUCCESS ;
    }
     
     
    void AppelleFonction ( int Type )
    {
       int i ;
     
       for ( i = 0 ; i < NFcts ; i++ )
          if ( Fcts[i].Type == Type )
             {
                Fcts[i].Adr ( Fct[i].Data );
                return ;
              }
    }
     
    int main(void) {
        MonData Data ;
     
        Data.a = 5;
        Data.b = 10;
        Data.result = 0;
     
        if ( StockeFonction ( ADD, (void *)&add, (void *)&Data ) )
          {
             fprintf ( stderr, "\nUne erreur s'est produite...\n");
             return EXIT_FAILURE ;
          }
     
        AppelleFonction ( ADD );
     
        printf("resultat : %d\n",Data.result);
     
        return EXIT_SUCCESS ;
    }


    ps : je n'ai pas essayé de faire marcher avec des fonctions void, mais c'est le principe. Je fais beaucoup ça, mais avec des fonctions qui retournent un entier...

    Dans ce cas je met une définition de fonction comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef int MAPROC (void *data);
     
    typedef struct {
        int     Type ;
        MAPROC *Adr ;
        void   *Data ;
    } Fct ;
    et c'est appelé comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     int statut ;
     
       statut = Fcts[i].Adr(Fcts[i].Data);

  8. #28
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut


    void Fonction ( void MaFonction, void *Data )
    {
    MaFonction ( Data );
    }

    ?????????
    c'est pas vraiment du C !

  9. #29
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    C'est bon je capte plutot bien ton code.

    Sinon si c'est du C --> Il utilise des pointeurs de fonction c'est assez compréhensible comme il le propose

  10. #30
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    comme je disais j'ai pas testé avec des fonctions void, mais c'est le principe, et ça correspond exactement à ce qu'Emmanuel présentait et à ton titre.

    En fait, ce genre de chose sert comme le disait Emmanuel à faire par exemple les gestionnaires d'événements dans les bibliothèques de GUI comme X, GTK, etc..

    tu as un widget (un bouton par exemple). Sur cet objet, plusieurs actions sont possibles (armer, clicker, etc..).

    Le gestionnaire implémente donc un mécasnisme comme décrit ci-dessus disant :

    Si l'utilisateur veut mettre une action sur le fait de cliquer, enregistres la fonction qu'il donne (celle qui est écrite dans le RAD : boutonmachintruc.clicker). Elle a des paramètres internes (que je n'ai pas mis ici) plus un paramètre sur les données utilisateurs (le data).

    Dans le gestionnaire, il y a une boucle qui dit :

    • Si c'est un click
    • Si c'est sur un bouton
    • On appelle la fonction interne (par exemple changer l'ombrage pour indiquer que c'est enfoncé)
    • Est-ce que ce bouton a une fonction enregistrée par l'utilisateur ?
    • Oui, alors on l'appelle


  11. Ca permet de fabriquer des bibliothèques qui peuvent PREVOIR d'avoir des actions SANS les connaître (comme signal par exemple).

  • #31
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par acx01b
    salut


    void Fonction ( void MaFonction, void *Data )
    {
    MaFonction ( Data );
    }

    ?????????
    c'est pas vraiment du C !

    Ah oui ? et pourquoi pas ?

  • #32
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    Bon je vais mettre un code propre (avec les void je suis pas certain que les adresses et les stockages marchent totalement) :

    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
    94
    95
    96
    97
    98
     
     
    #include <stdio.h>
     
    typedef struct {
       int a ;
       int b ;
       int result ;
    } MonData ;
     
    typedef int MAPROC (void *data);
     
    typedef struct {
        int     Type ;
        MAPROC *Adr ;
        void   *Data ;
    } Fct ;
     
     
    #define ADD  1
     
    #ifndef SUCCESS
    #define SUCCESS 0
    #define ERROR 1
    #endif
     
     
    static Fct *Fcts=NULL ;
    static int    NFcts=0 ;
     
    MAPROC add (void *Data) 
    {
       MonData *mdata = (MonData *)Data ;
     
        mdata->result = mdata->a + mdata->b;
     
       return SUCCESS ;
    }
     
     
    int StockeFonction ( int Type, MAPROC *MaFct, void *Data )
    {
       Fct tmp =NULL ;
     
        if ( NFcts == 0 )
          {
              Fcts = calloc ( 1, sizeof(Fct) );
              if ( Fcts == NULL )
                 return ERROR ;
          }
        else
          {
             tmp = realloc ( Fcts, ((NFcts+1)*sizeof(Fct)) );
             if ( tmp == NULL )
               return ERROR ;
             Fcts = tmp ;
          }
     
        Fcts[NFcts].Adr = MaFct ;
        Fcts[NFcts].Type = Type ;
        Fcts[NFcts].Data = Data ;
        NFcts = NFcts + 1 ;
     
        return SUCCESS ;
    }
     
     
    int AppelleFonction ( int Type )
    {
       int i, j ;
     
       for ( i = 0 ; i < NFcts ; i++ )
          if ( Fcts[i].Type == Type )
             {
                j = Fcts[i].Adr ( Fct[i].Data );
                return j ;
              }
    }
     
    int main(void) {
        MonData Data ;
     
        Data.a = 5;
        Data.b = 10;
        Data.result = 0;
     
        if ( StockeFonction ( ADD, (MAPROC *)&add, (void *)&Data ) )
          {
             fprintf ( stderr, "\nUne erreur s'est produite...\n");
             return EXIT_FAILURE ;
          }
     
        AppelleFonction ( ADD );
     
        printf("resultat : %d\n",Data.result);
     
        return EXIT_SUCCESS ;
    }

  • #33
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Merci pour toutes ces précisions
    Et je ne doutais pas du tout que c'était du C ce que tu avais mis
    J'ai même capté à la première lecture ce que tu faisais

  • #34
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    Bon je vais mettre un code propre (avec les void je suis pas certain que les adresses et les stockages marchent totalement) :
    <...>
    Ahem... Tu n'as pas compilé le code posté, çaÿ mal.

    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
     
    Compilateur: Default compiler
    Building Makefile: "C:\dev\forums\Makefile.win"
    Exécution de  make...
    make.exe -f "C:\dev\forums\Makefile.win" all
    gcc.exe -c main.c -o main.o -I"C:/Dev-Cpp/include"  -I"/clib"    -Wextra -Wall -O2
     
    main.c:30: error: `add' declared as function returning a function
    main.c: In function `StockeFonction':
    main.c:41: error: invalid initializer
    main.c:45: warning: implicit declaration of function `calloc'
     
    main.c:51: warning: implicit declaration of function `realloc'
     
    main.c:51: error: incompatible types in assignment
    main.c:52: error: invalid operands to binary ==
    main.c:54: error: incompatible types in assignment
    main.c: In function `AppelleFonction':
    main.c:73: error: syntax error before "Fct"
    main.c: In function `main':
    main.c:88: error: `EXIT_FAILURE' undeclared (first use in this function)
    main.c:88: error: (Each undeclared identifier is reported only once
    main.c:88: error: for each function it appears in.)
    main.c:95: error: `EXIT_SUCCESS' undeclared (first use in this function)
     
    make.exe: *** [main.o] Error 1
     
    Exécution terminée
    En dehors des erreurs signalées, il y des casts et des & inutiles. Ceci compile :
    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
    94
    95
    96
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
       int a ;
       int b ;
       int result ;
    } MonData ;
     
    typedef int MAPROC (void *data);
     
    typedef struct {
        int     Type ;
        MAPROC *Adr ;
        void   *Data ;
    } Fct ;
     
     
    #define ADD  1
     
    #ifndef SUCCESS
    #define SUCCESS 0
    #define ERROR 1
    #endif
     
    static Fct *Fcts=NULL ;
    static int    NFcts=0 ;
     
    int add (void *Data)
    {
       MonData *mdata = Data ;
     
        mdata->result = mdata->a + mdata->b;
     
       return SUCCESS ;
    }
     
     
    int StockeFonction ( int Type, MAPROC *MaFct, void *Data )
    {
       Fct *tmp =NULL ;
     
        if ( NFcts == 0 )
          {
              Fcts = calloc ( 1, sizeof(Fct) );
              if ( Fcts == NULL )
                 return ERROR ;
          }
        else
          {
             tmp = realloc ( Fcts, ((NFcts+1)*sizeof(Fct)) );
             if ( tmp == NULL )
               return ERROR ;
             Fcts = tmp ;
          }
     
        Fcts[NFcts].Adr = MaFct ;
        Fcts[NFcts].Type = Type ;
        Fcts[NFcts].Data = Data ;
        NFcts = NFcts + 1 ;
     
        return SUCCESS ;
    }
     
    int AppelleFonction ( int Type )
    {
       int i, j=-1 ;
     
       for ( i = 0 ; i < NFcts ; i++ )
          if ( Fcts[i].Type == Type )
             {
                j = Fcts[i].Adr ( Fcts[i].Data );
             }
       return j ;
    }
     
    int main(void) {
        MonData Data ;
     
        Data.a = 5;
        Data.b = 10;
        Data.result = 0;
     
        if ( StockeFonction ( ADD, add, &Data ) )
          {
             fprintf ( stderr, "\nUne erreur s'est produite...\n");
             return EXIT_FAILURE ;
          }
     
        AppelleFonction ( ADD );
     
        printf("resultat : %d\n",Data.result);
     
        return EXIT_SUCCESS ;
    }
    Attention, à vue de nez, ce qui a été alloué n'a pas été libéré...

  • #35
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ahem... Tu n'as pas compilé le code posté, çaÿ mal.
    OUI c'est vrai....



    J'ai juste voulu donner un exemple en copiant des morceaux de code que j'avais, pas faire un truc compilable... Désolé..

    Citation Envoyé par Emmanuel Delahaye
    Attention, à vue de nez, ce qui a été alloué n'a pas été libéré...
    Même réponse .. Même faute.. Encore une fois désolé ..

  • #36
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Tiens j'ai remarqué qu'il y avait un commentaire dans la fonction list_destroy qui utilise un pointeur de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /*appel d'une fonction utilisateur pour libérer */
    /*les données allouées dynamiquement         */
    Comme on a parlé dans ce thread de fonction utilisateur, ben je viens de tilter sur le fait que je vois pas exactement ce que c'est... Quand il met ça en commentaire, est ce que ca veut dire qu'il faut que je fasse une fonction pour supprimer ma liste ?

    Je remets du code pour une meilleur compréhension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct ListElmt_ {
        void *donnee;
        struct ListElmt_ *suivant;
    } ListElmt;
     
    typedef struct List_ {
        int taille;
        int (*corresp)(const void *val1,const void *val2);
        void (*detruire)(void *donnee);
        ListElmt *tete;
        ListElmt *queue;
    } List;
    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
     
    void list_init(List *liste, void (*detruire)(void *donnee)) {
        liste->taille   = 0;
        liste->detruire = detruire;
        liste->tete     = NULL;
        liste->queue    = NULL;
     
        return;
    }
     
    void list_destroy(List *liste) {
        void *donnee;
     
        while (list_size(liste) > 0) {
     
             if (list_rem_next(liste, NULL, (void **)&donnee) == 0 && liste->detruire !=  NULL) {
     
          /*****************************************************
          *                                                    *
          *  Appel d'une fonction utilisateur pour libérer     *
          *  les données allouées dynamiquement.               *
          *                                                    *
          *****************************************************/
     
                    liste->detruire(donnee);
       }
    }
     
        memset(liste, 0, sizeof(List));
     
        return;
    }
    J'ai essayé de faire de mon mieux pour réindenter le code, j'espère que ça donne pas trop mal.

    Merci d'avance pour vos réponse, ça va sûrement bien m'aider.

  • #37
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 615
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 615
    Billets dans le blog
    2
    Par défaut
    ben oui...

    sa structure est générique. Il gère une liste quelconque...

    Dans cette liste, on a des TAD (ou des objets opaques si tu préfères).

    Donc dans ces objets tu peux avoir des choses allouées.

    Donc avant de détruire l'objet, il faut éventuellement détruire ce qui a été alloué.

    Comme la structure est générique, elle n'a aucun moyen de savoir si des choses ont été allouées ou non. En conséquence c'est au programme appellant de définir la(les) routine(s) de destruction interne.

  • #38
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Donc il faut que je définisse une fonction qui permette de détruire les données de ma liste... Je vais y aller par étape parce que ce genre d'implémentation j'en ai jamais vu donc j'ai un peu de mal à capter correctement.

  • + Répondre à la discussion
    Cette discussion est résolue.
    Page 2 sur 2 PremièrePremière 12
    ActualitésFAQ CTutoriels CLivres CCompilateurs et outils CSources CGTK+

    Discussions similaires

    1. opengl et pointeur de fonction
      Par Oldhar dans le forum C
      Réponses: 5
      Dernier message: 06/11/2003, 23h56
    2. Declaration de fonction retournant un pointeur sur fonction
      Par pseudokifaitladifférence dans le forum C
      Réponses: 5
      Dernier message: 11/08/2003, 19h37
    3. Matrice de pointeurs de fonctions
      Par sebduth dans le forum C
      Réponses: 15
      Dernier message: 18/07/2003, 14h03
    4. [Kylix] Pointeur de fonctions
      Par _dack_ dans le forum EDI
      Réponses: 1
      Dernier message: 03/07/2003, 10h17
    5. pointeur de fonction
      Par kardath dans le forum C
      Réponses: 4
      Dernier message: 28/12/2002, 14h39

    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