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.
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
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
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
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
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
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
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
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 ...)
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
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...
Partager