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 :

[Débutant]Fonction à arguments variables


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 105
    Points : 41
    Points
    41
    Par défaut [Débutant]Fonction à arguments variables
    Bonjour à tous;
    J'essaie d'utiliser une fonction à arguments variables; mais quand je l'appelle avec un seul argument ça ne marche, et la méthode vsnprintf génère une exception, mais avec deux paramètre ça marche.
    Auriez-vous une solution ou une explication, pourquoi j'ai une exception à ce niveau. Merci à tous.

    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
    20
    21
    22
     
    CString GetMessages(const char* arg,...)
    {
     
    	CString LstMsg;
    	char	buf[4096], *p = buf;
    	const char* format="%s";
    	va_list	args;
    	va_start(args, arg);
    	p += _vsnprintf(p, sizeof buf - 1, format, args);
     
    	while ( p > buf  &&  isspace(p[-1]) ) {
    			*--p = '\0';
    	}
    	*p   = '\0';
     
    	char msg[4096]; 
    	sprintf (msg, format, buf);
    	LstMsg=msg;
            return LstMsg;
     
    }

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est quoi le problème exact ? C'est quelle version qui ne marche pas ? Quel compilateur ?

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Regarde du côté du man, il y a un exemple, car cela ne semble pas clair...

    et cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char	buf[4096], *p = buf;
    C'est pas très clair...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buf[4096];
    char *p = buf;
    Cela ne mange pas de pain, et au moins tu es sur que le compilateur ne possera pas de problème.

    "va_end" n'est pas présent non plus.

    [EDIT]
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CString LstMsg;
     LstMsg=msg;
     return LstMsg;
    Dans le version explicite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     return CString(msg);
    [/EDIT]

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    L'idée de départ, c'était de créer une méthode à nombre d'arguments variables, mais je m'étais rendu compten qu'il n'y a aucun moyen de controler le nombre d'arguments passés à la méhode.
    Le contrôle, voir ci dessous, renvoie toujours un bad_ptr, et je ne sors jamais de la boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* s;
    while((s=va_arg (ap, char *)!=0){
      //traitement
    }
    Merci.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Passe plutôt des vecteurs de boost::any<> ou des vecteurs tout court, c'est plus sûr.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Les fonctions à arguments variables c'est pas terrible.
    Si vraiment t'en veux utilise les "variadic templates" de C++0x (y'a un patch pour GCC)
    Boost ftw

Discussions similaires

  1. Réponses: 13
    Dernier message: 17/09/2014, 18h09
  2. Fonctions à arguments variables rendues impossibles par prototype
    Par Difré91 dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 14/06/2010, 16h07
  3. Fonction à arguments variables
    Par Amnesiak dans le forum Langage
    Réponses: 2
    Dernier message: 13/03/2008, 14h20
  4. [Débutant] Nombre d'arguments variables
    Par akrodev dans le forum C++
    Réponses: 9
    Dernier message: 01/06/2006, 02h51
  5. Réponses: 4
    Dernier message: 31/10/2005, 17h48

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