j'ai conscience qu'il y a déjà topic sur les pointeurs sur fonction mais je ne trouve pas les réponses à mes questions. (trop de level chez les autres)
J'ai vraiment du mal à comprendre la façon dont cela fonctionne.
voilà mon code.
///////////////////////Liste de fonction appele dans le programme ////////////////////
double
saisi()
{
//fonction saisi des nombres √ †traiter.
double x = 0;
printf("saisi nombre à traiter\n>> ");
scanf("%lf", &x);
return x;
}
///////////////////////////////////////////////////////////////////////////////
double
addition(double x, double y)
{
return x + y;
}
double
soustraction(double x, double y)
{
return x - y;
}
double
multiplication(double x, double y)
{
return x * y;
}
double
division(double x, double y)
{
return x / y;
}
///////////////////////////////////
double fonction(double x)
{
//Menu et calcul d 'une fonction choisit
int f = 0;
//variable permettant de choisir une fonction a calculer
double r;
printf(" f(x)= \n1. x 2. x² 3. x³ ");
printf("\n\n4. cos(x) 5. sin(x) 6. tan(x)");
printf("\n\n7. 1/x 8. ln(x) 9. exp(x)\n>>");
scanf("%d", &f);
//saisi de l 'operation a effectuer
switch (f) {
case 1:
r = x;
break;
case 2:
r = pow(x, 2);
break;
case 3:
r = pow(x, 3);
break;
case 4:
r = cos(x);
break;
case 5:
r = sin(x);
break;
case 6:
r = tan(x);
break;
case 7:
r = 1 / x;
break;
case 8:
r = log(x);
break;
case 9:
r = exp(x);
break;
}
return r;
}
//////////////////////////////////////////////////////////////////////////////////
double f(double x) //fonction en cours, la fonction f est appele dans la fonction integral
{
ptr_fct = fonction;
return ptr_fct;
}
/////////////Calcul integral //////////////////////////////////////////////////
Comme vous le voyez c'est une calculatrice permettant de faire les opérations de base mais aussi le calcul de fonction ainsi que d'intégrale.
Je voudrais être capable de créer un pointeur sur fonction pour calculer l'integral de la fonction choisie dans le sous menu "fonction".
La fonction integral prendrait alors 4 paramètres : les bornes a et b, les pas n et le pointeur sur fonction (permettant de savoir quelle fonction intégrer.
mes questions : -où déclarer le pointeur ?
-le pointeur peut il pointer sur la valeur renvoyer la la fonction "fonction" ?
Commençons par ta fonction fonction, elle devrait retourner un pointeur de fonction (la toute première ligne est très complexe mais peut s'écrire en 2 lignes pour être beaucoup plus lisible.)
double (*fonction(void))(double) { // fonction sans paramètre retournant un pointeur sur une fonction recevant un double et retournant un double
// Menu et calcul d 'une fonction choisie
int f = 0;
// variable permettant de choisir une fonction a calculer
double (*r)(double); // un pointeur sur un fonction recevant un double et retournant un double
printf(" f(x)= \n1. x 2. x² 3. x³ ");
printf("\n\n4. cos(x) 5. sin(x) 6. tan(x)");
printf("\n\n7. 1/x 8. ln(x) 9. exp(x)\n>>");
scanf("%d", &f);
// saisie de l'operation a effectuer
switch ( f ) {
case 1:
r = &idem; // un pointeur s'initialise toujours à partir d'une adresse (ici adresse d'une fonction)
break;
case 2:
r = &pow2;
break;
case 3:
r = &pow3;
break;
case 4:
r = &cos;
break;
case 5:
r = &sin;
break;
case 6:
r = &tan;
break;
case 7:
r = &inverse;
break;
case 8:
r = &log;
break;
case 9:
r = &exp;
break;
}
return r;
}
Il a fallu créer des fonctions (en prenant leur adresse on a un pointeur de fonction), toutes reçoivent un double et retournent un double. Elle doivent être placées avant la fonction fonction.
double idem( double x ) {
return x;
}
double inverse( double x ) {
return 1. / x;
}
double pow2( double x ) {
return x * x;
}
double pow3( double x ) {
return x * x * x;
}
La fonction integrale doit recevoir en dernier paramètre un pointeur sur une fonction, on appelle f ce pointeur
double integrale( double a, double b, int n, double (*f)(double) ) {
... ... ... // ici f est une fonction utilisable
}
Et dans le main on doit remplacer la ligne 82 par :
double (*ptrfct)(double) = fonction(); // demander un pointeur mémorisé dans ptrfct
result = integrale( a, b, n, ptrfct ); // transmettre ce pointeur à integrale
Et si je comprend bien, il a fallu 2 pointeurs, 1 pour pointer la fonction désiré, et le second pour passer cette fonction en paramètre du calcul integral ?
Faisons simple et logique :ça marche exactement(*) comme des pointeurs d'autre chose
1. si tu avais des (par exemple) entiers a,.... pour avoir un pointeur p qui pointe sur a tu ferais : p = & a.
Pareil si tu as des fonctions somme, produit, .... et que tu veux un pointeur ptr qui pointe sur une de ces fonctions, pour qu'il pointe sur somme, tu peux faire :
ptr = & somme;
2. maintenant si tu veux accéder à la valeur désignée par p, tu l'appelles *p.
Pareil pour les fonctions. Avec somme tu ferais
double toto = somme(1.2, 3.4);
alors avec ptr, tu fais
double toto = (*ptr) (2.3, 3.4);
3. Et comme en C la déclaration se conforme à l'usage; puisque tu as
double somme (double a, double b);
ptr se déclare en remplaçant somme par *ptr
double (*ptr) (double a, double b);
Voila les bases.
(*) Ensuite, il se trouve que le standard autorise des simplifications dans l'usage, pour les variables qui sont reconnues comme des pointeurs de fonctions. On peut omettre l'étoile
ptr = somme;
double toto = ptr(3.4, 5.6);
Et enfin, quand on a des pointeurs de fonctions, il est de bon gout d'user du typedef pour ne pas se retrouver avec des déclarations à rallonge
Pour reprendre quelque chose qui ressemble à ton exemple, mais sans faire ton exercice, imaginons qu'on veuille calculer f(1)+f(2) +.... f(n), pour une fonction f et un entier n donnés.
#include <stdio.h>
typedef float (*FonctionUnaire)(int);
float somme(FonctionUnaire f, int n) {
float s = 0;
for (int i = 1; i <= n; i++) {
s += f(i);
}
return s;
}
float inverse_carre(int n) {
return 1.0 / (n*n);
}
int main()
{
printf("-> 1/1 + 1/4 + 1/9 = %f\n", somme(inverse_carre, 3));
return 0;
}
- Edité par michelbillaud 17 février 2019 à 12:46:10
Pointeurs sur fonction... aïe
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.
En recherche d'emploi.