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 et structure


Sujet :

C

  1. #1
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut Pointeur de fonction et structure
    Bonsoir,

    J'essaie de faire un pointeur de fonction contenu dans une structure dans le cadre d'un projet OpenGL. Pour le pointeur de fonction je n'ai aucun soucis (voir operation()). Cependant, lorsque je définis un pointeur de fonction dans une structure, quand je veux l'initialiser avec une fonction, alors cela provoque une segmentation fault, mais le résultat est tout de même affiché (voir operation2()).

    Voici un exemple simplifié en dessous :

    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
    #include <stdio.h>
     
    typedef int (*Func)(int, int);
     
    struct Str
    {
      Func func;
    };
    typedef struct Str StructFunc;
     
    int somme(int i, int j)
    {
        return i+j;
    }
     
    int multiplication(int i, int j)
    {
        return i*j;
    }
     
    int quotient(int i, int j)
    {
        return i/j;
    }
     
    int modulo(int i, int j)
    {
        return i%j;
    }
     
    void operation(Func *func)
    {
        printf("%i\n", (*(func))(3,5));
    }
     
    void operation2(StructFunc *structFunc)
    {
        printf("%i\n", (*(structFunc->func))(3,-4));
    }
     
    int main()
    {
        Func f;
     
        f = &somme;
     
        operation(&f);
     
        StructFunc *sF;
     
        sF->func = &multiplication;
     
        operation2(sF);
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    8
    -12
    Erreur de segmentation
    Comment je peux faire pour éviter cette erreur?

    Note : Je dois respecter le prototype de operation2()

    Merci pour votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Tu as déclaré un pointeur sur structure mais tu n'as pas alloué de mémoire (malloc()). D'où la segfault.

    Nas'

  3. #3
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    L'allocation, je la fais sur quoi? Car en dehors de la structure, je ne fais pas de malloc et ça marche. Je le fais sur la structure ou sur le pointeur de fonction?

    Ca donne quoi?

    Merci

  4. #4
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Sur la structure. Un pointeur ne peut pas être utilisé sans le faire pointer quelque part. Or ta structure ne pointe vers aucune zone réservée à cet effet.
    Ca conduit à un comportement indéfini, ce qui fait que le code peut marcher ou non...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    StructFunc *sF = malloc(sizeof *sF);
    if(sF) 
    // malloc a reussi, on continue
    else
    // alloc impossible
    Nas'

  5. #5
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Merci ça marche. Pour les autres structures, je ne les avaient pas allouées dynamiquement, c'est surement parce-que j'ai un pointeur dans celui_là que je dois le faire. En attendant, il ne me reste plus qu'un warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test3.c: Dans la fonction « main »:
    test3.c:49: attention : initialisation transforme un entier en pointeur sans transtypage
    Si tu peux une dernière fois m'aider ça serait merveilleux.

    Merci en tout cas pour le malloc.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Pointeur de fonction et structure
    Citation Envoyé par Trunks
    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
     
    int main()
    {
        Func f;
     
        f = &somme;
        operation(&f);
     
        StructFunc *sF;
     
        sF->func = &multiplication;
        operation2(sF);
     
        return 0;
    }
    C'est quand même drolement bizarre. Pour f, tu définis bien une instance et tu passes l'adresse à la fonction operation(), mais pour sF, tu fais autrement. Pourquoi ? Tu définis un pointeur, il n'est jamais initialisé, tu le déréférences... Bref, le comportement est indéterminé. Pourquoi avoir changé de tactique ?

    Qu'est-ce qui ne va pas avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       StructFunc sF;
     
       /* & inutile supprime */
        sF.func = multiplication; 
     
        operation2(&sF);
    ?
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Nasky
    Tu as déclaré un pointeur sur structure mais tu n'as pas alloué de mémoire (malloc()). D'où la segfault.

    Nas'
    Pourquoi malloc() ? Pourquoi ne pas créer une instance de la structure et passer son adresse ? Pourquoi compliquer quand on peut faire simple ?
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. structure / pointeur sur fonction
    Par fd_caramba dans le forum Débuter
    Réponses: 4
    Dernier message: 28/09/2008, 18h06
  2. Déclaration de pointeur de fonction et structure
    Par ShaiLeTroll dans le forum Delphi
    Réponses: 28
    Dernier message: 05/04/2007, 10h48
  3. Réponses: 9
    Dernier message: 14/01/2007, 16h40
  4. structures et pointeurs de fonctions
    Par aimad41 dans le forum C
    Réponses: 5
    Dernier message: 21/11/2006, 10h49
  5. Structure, pointeur et fonction...
    Par Linaa dans le forum C
    Réponses: 15
    Dernier message: 04/12/2005, 13h12

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