Bonjour à tous
malgré pas mal de recherches je n'arrives pas bien à cerner l'intérêt de passer un pointeur sur une fonction comme ceci:
int *fct ( ... )
{
...
return &p
}
au lieu d'un traditionnel int fct (...) { ... }
Merci d'avance.
Bonjour à tous
malgré pas mal de recherches je n'arrives pas bien à cerner l'intérêt de passer un pointeur sur une fonction comme ceci:
int *fct ( ... )
{
...
return &p
}
au lieu d'un traditionnel int fct (...) { ... }
Merci d'avance.
Danstu ne passes pas du tout l'adresse d'une fonction, cette fonction en fait retourne un pointeur vers un enteir, donc en fait l'adresse d'un entier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int *fct ( ... ) { ... return &p }
Petite remarque comme tu fais return &p; on "peut" penser que ce p est une variable locale à la fonciton dont l'adresse sera devenue inutilisable au sortir de cette fonction, donc c'est une faute grave en C, signalée en principe par un compilo bien réglé.
Par contre ce peut-être très utile de passer des adresses de fonctions : par exemple le qsort de C est une fonction qui permet de trier très rapidement n'importe quele type de tableau d'objets, commet fait cette fonction ? tout simplement on lui fournit, en particulier, l'adresse de la fonction de comparaison des éléments du tableau.
oui tout a fait.Envoyé par Trap D
si j'ai bien compris ca peut être très pratique pour faire passer un tableau à une autre fonction:
est-ce un moyen pour éviter les problèmes de variables locales-globales entre fonctions ?
je patoge un peu![]()
Bonjour,
il existe un tutorial très bien fait sur les pointeurs de fonctions à cette adresse :
http://www.newty.de/fpt/index.html
Possibilité de télécharger les tutoriaux en PDF ou PS (en français ou anglais) et les codes sources.
Voir aussi la section liens ( http://www.newty.de/fpt/chapt5.html#misc ) qui est intéressante.
Merci pour le lien, c'est toujours bienvenu!
Meilleures salutations
Thierry
Non.Envoyé par bogosse
Les applications des pointeurs de fonctions sont basées sur des concepts assez avancés (liens dynamiques, callbacks) que je te conseille de voir un peu plus tard quand tu 'pataugeras" moins en C...est-ce un moyen pour éviter les problèmes de variables locales-globales entre fonctions ?
je patoge un peu![]()
Mais si tu y tiens, voici un article qui utilise la notion de 'callback' très utilisé en programmation évènementielle :
http://emmanuel-delahaye.developpez.com/complog.htm
Je ne crois pas que la question initiale se portait sur les pointeurs de fonction, mais sur les fonctions qui renvoient un pointeur:Les applications des pointeurs de fonctions sont basées sur des concepts assez avancés
Code de la question originale
Il y a deux manières d'utiliser un tel code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int *fct ( ... ) { ... return &p }
Cas 1
Cas 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int * fonction(int *p_valeur) { *p_valeur = 1; return p_valeur; }
Le cas suivant conduit à une fuite de mémoire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int * fonction(void) { int *p_valeur; p = malloc(sizeof *p); if (p != NULL){ *p_valeur = 1; } return p_valeur; }
Meilleures salutations
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int * fonction(void) { int p; p = 1; return &p; }
Thierry
Il y a encore un 3e cas...
Cas 3
Salutations
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int * fonction(void) { int tableau[10] = {1}; return tableau; }
Thierry
Euh, tu veux direEnvoyé par mujigka
Sinon, tu renvoies une adresse qui n'est pas valide hors de la portee de la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 static int tableau[10] = {1};
Euuuh! AUTANT POUR MOI! Je ne sais pas trop ce qui m'a pris de dire de pareilles bétises. Merci de me reprendre. Cas n°3 à oublier!!! D'ailleurs, vous voyez un cas n°3?Euh, tu veux dire
Sinon, tu renvoies une adresse qui n'est pas valide hors de la portee de la fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 static int tableau[10] = {1};
Meilleures salutations et encore merci
Thierry (qui promet de retourner 7 fois sa langue avant de ...)
merci mujigka pour les 2 exemples d'utiliser le code, mais je ne comprend toujours pas l'intérêt qu'une fonction renvoi une adresse ou une valeur dans la pratique![]()
- C'est la seule facon de renvoyer un tableau de valeurs alloue a l'interieur d'une fonction.Envoyé par bogosse
- C'est conseille lorsqu'on renvoie une structure potentiellement grande (pour eviter les couts de copie).
- C'est la seule facon d'implementer un constructeur de type abstrait (abstract data type), voir le retour de fopen() par exemple.
- d'autres raisons que j'oublie...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager