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 :

Paramère d'une fonction


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut Paramère d'une fonction
    Bonjour à tous et à toutes
    J'aimerai développer une fonction qui traite les données selon leurs types. l'information sur le type est passée par valeur via cette fonction.
    par exemple : void fonction (type variable);
    le problème c'est que la variable est tantôt entier tantôt float.
    j'ai choisi le type comme void: void fonction (void variable); mais ça marche pas.
    Pourriez vous m'aider?
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Bonjour,

    Ce que tu veux faire s'appelle une surcharge de fonction, mais le C ne prend pas cela en charge en standard (le C++, par contre, si).

    Si tu veux faire le même genre d'opération sur deux types différents, alors le code généré sera différent dans chaque cas et il s'agira bien de deux fonctions distinctes. Les langages qui savent le faire les distinguent justement avec leur signature, c'est-à-dire leur nom combiné au type de leurs arguments. En outre, tu ne peux pas savoir à l'exécution quel est le type d'une variable puisque tout le traitement a été fait en amont, à la compilation, et que du code adapté a été produit pour traiter directement les données. Il ne reste donc aucune méta-information à l'exécution et c'est volontaire (là encore, le C++ propose le RTTI mais on essaie d'éviter d'y recourir si ce n'est pas nécessaire).

    Pour y parvenir, tu peux au choix :

    • Adopter l'approche de printf(), c'est-à-dire indiquer explicitement le format de la donnée dans un paramètre distinct ;
    • Écrire plusieurs fonctions distinctes incluant le type de données dans leur nom : FonctionLong(), FonctionInt(), FonctionChar()… ;
    • Utiliser une union pour embarquer tous les types reconnus par ta fonction, et utiliser cette union à la fois comme type de ta fonction et celui de ton paramètre, c'est-à-dire à la fois en entrée et en sortie.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut
    Merci pour votre réponse
    J'ai pas bien compris cette phrase:
    Citation Envoyé par Obsidian Voir le message
    [*]Utiliser une union pour embarquer tous les types reconnus par ta fonction, et utiliser cette union à la fois comme type de ta fonction et celui de ton paramètre, c'est-à-dire à la fois en entrée et en sortie.[/LIST]
    Pourquoi en entrée et en sortie?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par achrafkaran Voir le message
    Pourquoi en entrée et en sortie?
    Ce n'est pas obligatoire mais j'ai supposé que c'était ce que tu voulais faire. Renvoyer une donnée de la même nature que celle que tu as reçue en paramètre.

    Option supplémentaire, généralement la plus répandue (et probablement celle que tu as essayé de mettre en place) : utiliser un pointeur void.

    Si tu définis un paramètre avec « void p », tu indiques au compilateur que le type du paramètre est inconnu. Il ne peut donc rien faire avec. Par contre, si tu utilises « void * », tu indiques qu'il s'agit d'un pointeur pointant une donnée de type inconnu, ce qui empêche nullement le compilateur de passer le contenu du pointeur à la fonction. À charge à cette fonction, ensuite, de transtyper ce pointeur vers le bon type. Cela implique quand même qu'elle ait un moyen de le savoir.

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut
    Re.
    Maintenant j'ai bien compris
    Voici ce que je vais faire :
    on suppose que le prototype de la fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void function( void * const var);
    * cas des données flottantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float l_var;
    l_var = 0.6;
    function( &l_var);
    * cas des données entiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned int l_var;
    l_var = 0x0F;
    function( &l_var);
    Est-ce juste ?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    C'est tout-à-fait cela, mais il faudra quand même apporter à ta fonction un moyen de savoir ce sur quoi elle pointe.

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut
    Re.

    càd: function( (flaot)&l_var); ou bien function( (unsigned int )&l_var); ?

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par achrafkaran Voir le message
    Re.

    càd: function( (flaot)&l_var); ou bien function( (unsigned int )&l_var);?
    Eh non ! Ça, par contre, ça ne te servira à rien. Même si tu transtypes ton paramètre, il sera de toutes façons retranstypé en pointeur void lors de l'appel à la fonction. Cette fonction, elle, va bien recevoir un pointeur mais rien ne va lui dire quelle est sa nature : c'est une information qui est déterminée à l'avance, à la compilation. Tu n'as pas d'autre choix que lui passer un second paramètre pour dire explicitement à ta fonction de quoi il s'agit, à moins que la donnée elle-même soit reconnaissable d'une façon ou d'une autre.

    En outre, il va bien falloir que tu distingues les deux cas de figures dans ton code et que tu mettes en place pour cela un « if » dans le corps de ta fonction. Ce « if » devra bien s'appuyer sur quelque chose pour prendre sa décision.

    À moins que ce que tu aies derrière la tête, c'est faire une fonction dont le code soit le même pour tous les types de données. Par exemple, une fonction « type Addition (type a, type b) { return a+b; } ». Ça, ça s'appelle un template et c'est réservé au C++ également. C'est un mécanisme très puissant mais qui induit une grande complexité que l'on ne soupçonne pas de prime abord.

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 74
    Par défaut
    Merci infiniment pour votre réponse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  2. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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