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 :

Passer en argument d'une fonction, n'importe quelle fct


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut Passer en argument d'une fonction, n'importe quelle fct
    Bonjour,

    Je cherche à faire passer en argument de MaFonction, n'importe quelle fonction en tenant compte de son return.
    Voilà ce que j'ai trouvé dans la litérature mais j'ai des soucis pour l'appliquer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int (*MaFonction)();
    Je ne sais pas quel type MaFonction va retourner et je ne sais pas quels paramètres MaFonction va demander comme arguments puisque je ne la connais pas.

    Est-ce possible?
    J'ai essayé un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void *(*MaFonction(void*(*Fct)()));
    void *(*MaFonction(void*(*Fct)()))
    {
     ...
    }
    Mais c'est pas trop ça

    Pour mieux me comprendre, j'aimerai faire passer par exemple des fonctions putchar() ou getchar() comme paramètres dans MaFonction et que le return soit le return de l'une ou de l'autre... Il faudrait que l'écriture de l'appel de MaFonction ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     char c;
     c = MaFonction(getchar());
    // ou
     short rep;
     rep = MaFonction(putchar(c));

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Pour le pointeur de fonction, le mieux est de passer par un typedef:
    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
    /* Declare le type: Pointeur vers fonction
       retournant un int et acceptant n'imp en paramètre */
    typedef int (*PTR_INT_FONC_NIMP)();
     
     
    int FonctionQuiAppelleUneFonction(PTR_INT_FONC_NIMP func)
    {
    /* faire des trucs avec et retourner une valeur
       par exemple celle retournée par la fonction pointée */
    }
     
    void FonctionUtilisatrice
    {
    char c;
    c = MaFonction(getchar);
    // ou
    short rep;
    rep = MaFonction(putchar);
    }
    Par contre, on ne peut pas passer de paramètres "variables" sans passer par de l'assembleur. Pour ça, je te conseillerais plutôt de définir des fonctions pointées prenand une va_list (défini dans <stdarg.h>) en paramètre...

  3. #3
    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 James_
    Je cherche à faire passer en argument de MaFonction, n'importe quelle fonction en tenant compte de son return.
    Voilà ce que j'ai trouvé dans la litérature mais j'ai des soucis pour l'appliquer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int (*MaFonction)();
    Je ne sais pas quel type MaFonction va retourner et je ne sais pas quels paramètres MaFonction va demander comme arguments puisque je ne la connais pas.

    Est-ce possible?
    Un type retour générique, non, ce n'est pas vraiment possible (le coup du void* est plutôt fumeux. L'adresse de quoi ? Statique ? Dynamique ?

    int est un type qui couvre bien des cas (char, short, int...). long couvre les mêmes plus long... Je dirais int ou long. C'est ce qui se fait dans la réalité :

    getchar() -> int
    strtol() -> long
    etc.

    Il n'y a jamais de retour (ni de paramètre) de type char ou short (c'est int minimum, question de promotion).
    J'ai essayé un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void *(*MaFonction(void*(*Fct)()));
    void *(*MaFonction(void*(*Fct)()))
    {
     ...
    }
    Mais c'est pas trop ça
    Ca fout la trouille !
    Pour mieux me comprendre, j'aimerai faire passer par exemple des fonctions putchar() ou getchar() comme paramètres dans MaFonction et que le return soit le return de l'une ou de l'autre... Il faudrait que l'écriture de l'appel de MaFonction ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     char c;
     c = MaFonction(getchar());
    // ou
     short rep;
     rep = MaFonction(putchar(c));
    Pas clair. getchar(), c'est un appel de fonction qui retourne un int.
    L'adresse de la fonction, c'est getchar tout court...
    Tu veux peut être dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int c = MaFonction (getchar);
    // ou
    int rep = MaFonction (putchar, c);

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Un type retour générique, non, ce n'est pas vraiment possible (le coup du void* est plutôt fumeux. L'adresse de quoi ? Statique ? Dynamique ?

    int est un type qui couvre bien des cas (char, short, int...). long couvre les mêmes plus long... Je dirais int ou long. C'est ce qui se fait dans la réalité :
    C'est le genre de coup pour lequel je conseillerais les types capables de contenir un peu de tout, genre intptr_t (garanti, il me semble, assez grand pour contenir un int, et assez grand pour contenir un pointeur).

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il n'y a jamais de retour (ni de paramètre) de type char ou short (c'est int minimum, question de promotion).
    Tu as une référence STP? Je ne me souviens pas de ça et je suis incapable de trouver une telle chose dans la norme. Mon interprétation de ce qui me semblent être les sections adéquates, c'est que les promotions n'entrent en jeux que pour les paramétres de fonctions variadiques ou sans prototypes.

  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
    Citation Envoyé par Jean-Marc.Bourguet
    Tu as une référence STP? Je ne me souviens pas de ça et je suis incapable de trouver une telle chose dans la norme. Mon interprétation de ce qui me semblent être les sections adéquates, c'est que les promotions n'entrent en jeux que pour les paramétres de fonctions variadiques ou sans prototypes.
    Le terme promotion est peut être inexact dans ce contexte, en tous cas, il est clair dans mon esprit, que les paramètres ont au minium une taille 'int'. Je n'ai pas de contre exemple dans la bibliothèque standard.

    De ce que j'ai pu voir des implémenattions que je connais, c'est que toute tentative de mettre un paramètre ou un retour plus petit se solde par du code en plus mais aucun gain mémoire. (En x86 mode réel, pour le retour, on passe par AX en int et AL en char)

    D'autre part avec une certaine option, gcc prévient que la taille a été ajustée ou qu'il est inutile de mettre une taille plus petite...

    Il est possible que ce soit plus une contrainte d'implémentation qu'une directive de la norme.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    D'autre part avec une certaine option, gcc prévient que la taille a été ajustée ou qu'il est inutile de mettre une taille plus petite...
    Je suppose que tu penses à
    Citation Envoyé par Doc de gcc
    `-Wconversion'
    Warn if a prototype causes a type conversion that is different from what would happen to the same argument in the absence of a prototype. This includes conversions of fixed point to floating and vice versa, and conversions changing the width or signedness of a fixed point argument except when the same as the default promotion.
    C'est un warning utile uniquement quand on a du code pas complètement converti à l'utilisation des prototypes et qu'on cherche à trouver les endroits où ça pose problème. Dans du code sensé être complètement prototypé ou bien en cours de conversion:
    Citation Envoyé par Doc de gcc
    `-Wstrict-prototypes (C only)'
    Warn if a function is declared or defined without specifying the argument types. (An old-style function definition is permitted without a warning if preceded by a declaration which specifies the argument types.)

    `-Wold-style-definition (C only)'
    Warn if an old-style function definition is used. A warning is given even if there is a previous prototype.
    sont plus utiles et permettent de détecter les cas où les prototypes sont absents.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut
    Pas clair. getchar(), c'est un appel de fonction qui retourne un int.
    L'adresse de la fonction, c'est getchar tout court...
    Tu veux peut être dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code :
     
    int c = MaFonction (getchar);
    // ou
    int rep = MaFonction (putchar, c);
    Donc suivant ma fonction à mettre en paramètre, définir son nombre et type d'arguments, du coup il faut passer par <stdarg.h>...
    N'y a-t-il pas moyen d'utiliser une macro?
    Je veux juste ajouter toujours UneDeMesFonctions() avant certaines fonctions déjà définie comme getchar(), etc... du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     // si j'utilise seulement getchar()
        int MaFctGetChar(void)
        {
            if(UneDeMesFonctions())
            {
                return(getchar());
            }
            return(-1);       
        }
    Pour information, je ne suis pas d'accord avec vous sur:
    Il n'y a jamais de retour (ni de paramètre) de type char ou short (c'est int minimum, question de promotion).
    Vous raisonnez en compilateur C pour systèmes d'exploitations tels que windows ou Linux, il y a d'autre système où les compilateurs C renvoit des types char ou short, en dessus de char c'est impossible par contre.
    Merci

  9. #9
    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 James_
    Vous raisonnez en compilateur C pour systèmes d'exploitations tels que windows ou Linux, il y a d'autre système où les compilateurs C renvoit des types char ou short, en dessus de char c'est impossible par contre.
    C'est techniquement faisable, mais ça n'apporte rien d'autre que du code en plus...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut
    C'est techniquement faisable, mais ça n'apporte rien d'autre que du code en plus...
    Vous répondez à quelle question?
    Techniquement, il est impossible qu'un système travail en dessus d'une taille "char" car la plus petite taille d'un registre accumulateur sur laquelle un processeur peut travailler est codé sur 8 bits. Même si vous travaillez avec un seul bit, les opérations seront effectuées sur cet accumulateur et donc sur 8 bits minimum qui correspond à la taille d'un "char".

    Mais personne ne répond à ma question à savoir quelle méthode conseillez-vous si je veux ajouter toujours le même code avant d'utiliser des fonctions d'une bibliothèque?

Discussions similaires

  1. Passer un argument dans une fonction appelée depuis un onChange
    Par francky74 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/03/2015, 09h28
  2. [AJAX] passer un argument a une fonction de callback ?
    Par mld_webcom2d dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 11/02/2009, 17h05
  3. Passer un argument a une fonction a traver URL
    Par sitirna dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/02/2009, 16h07
  4. Comment passer un argument dans une fonction
    Par DeezerD dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 22/01/2008, 18h13
  5. passer FILE* en argument d une fonction
    Par Monsieur_Manu dans le forum C
    Réponses: 9
    Dernier message: 10/04/2003, 17h56

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