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:
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:
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.
Re: Pointeur de fonction et structure
Citation:
Envoyé par Trunks
Code:
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:
1 2 3 4 5 6 7
|
StructFunc sF;
/* & inutile supprime */
sF.func = multiplication;
operation2(&sF); |
?