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 :

Fonction avec type de paramètre variable


Sujet :

C

  1. #1
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut Fonction avec type de paramètre variable
    Bonjour,

    Je veux implémenter une fonction C qui a un type de paramètre variable :

    Selon 'cas', je lui passe soit une variable chaîne de caractères pour récupérer une seule chaîne de caractère, ou bien je lui passe une variable tableau de chaînes de caractères pour récupérer plusieurs chaînes. Bref, un truc équivalent à la surcharge de fonctions dans d'autres langages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void maFonction (int cas, char*);
    void maFonction (int cas, char**);
    Je veux garder une seule fonction avec des traitements 'case' selon le cas.

    Est-ce faisable?

    Merci.

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Est-ce que tu veux traiter uniquement des chaines de caractères?
    Si c'est le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void maFonction (int cas, char**);
    Peut être utilisée pour les deux cas que tu cites.

    Sinon, si tu veux un type "générique", utilise un pointeur générique

  3. #3
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    Est-ce que tu veux traiter uniquement des chaines de caractères?
    Si c'est le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void maFonction (int cas, char**);
    Peut être utilisée pour les deux cas que tu cites.

    Sinon, si tu veux un type "générique", utilise un pointeur générique
    Oui je vois avec le char**.
    Mais pour void*, ça ne pose pas de problème au niveau du traitement (compatibilité) ? par exemple, si je me place dans le cas d'un tableau de chaînes, comment je gère ça avec le void *?

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Pour savoir si ton pointeur void * correspond à un char * ou à un char **, tu n'auras pas d'autre choix que de rajouter un paramètre pour déterminer le type à utiliser.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Est-ce que tu veux traiter uniquement des chaines de caractères?
    Si c'est le cas void maFonction (int cas, char**);Peut être utilisée pour les deux cas que tu cites.
    Non, elle ne peut être utilisée directement avec une chaine de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *chaine1 = "abcdef";
    maFonction(cas,&chaine1); // OK
     
    char chaine2[]= "abcdef"; 
    maFonction(cas, ???);     // Quoi mettre ?

  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Quelquechose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char** string = (char**)malloc(sizeof(char)*SIZE);
    strcpy(string[0], "abcdef");
    maFonction(cas, string);

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Non, si on veut vraiment le faire, on aura
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char chaine2[]= "abcdef"; 
    char * p = chaine2;
    maFonction(cas, &p);
    Mais c'est un accès 'indirect' à la chaine.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

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

    Citation Envoyé par zentaf Voir le message
    Oui je vois avec le char**.
    Mais pour void*, ça ne pose pas de problème au niveau du traitement (compatibilité) ? par exemple, si je me place dans le cas d'un tableau de chaînes, comment je gère ça avec le void *?
    Si tu précise le cas dans « cas » et qu'il implique des paramètres très différents, le plus propre consistera peut-être à utiliser une union. Ça te permettra de conserver ta déclaration sans avoir à faire de transtypages magiques à l'intérieur de ta fonction.

Discussions similaires

  1. Macro-fonction avec nombre de paramètres non fixé
    Par miasseu dans le forum Macro
    Réponses: 2
    Dernier message: 31/08/2012, 16h36
  2. fonction avec nb d'argument variable
    Par firstnewgaia dans le forum Débuter
    Réponses: 2
    Dernier message: 06/05/2011, 12h30
  3. fonction avec this en paramètre
    Par bakman dans le forum Débuter
    Réponses: 18
    Dernier message: 07/04/2011, 12h25
  4. fonction avec setTimeOut et paramètres
    Par jeff74 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/10/2008, 19h26
  5. Réponses: 9
    Dernier message: 22/07/2005, 16h10

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