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 :

Problème de paramètres variables et références dans une fonction


Sujet :

C++

  1. #1
    Koo
    Koo est déconnecté
    Membre régulier Avatar de Koo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 76
    Points : 84
    Points
    84
    Par défaut Problème de paramètres variables et références dans une fonction
    Bonjour,

    Un bout de code qui ne marche pas :
    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
    void foo(int& i, ...)
    {
        va_list ap;
        va_start(ap, i);
        printf("%d\n", va_arg(ap, int));
        va_end(ap);
    }
     
     
    int main()
    {
        int j=0;
        pack(j, 15);
     
        return 0;
    }
    Le problème semble venir de la référence i, comme si le va_start ne le "détectait" pas comme paramètre et se met à pointer n'importe où (à la place du paramètre suivant), ce qui affiche une valeur absurde dans le printf pour le 2nd paramètre.

    Si i n'est pas une référence ça marche très bien. Evidemment on peut contourner le problème avec un pointeur à la place de la référence mais j'aimerais connaître la raison de cette erreur.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il y a deux choses à prendre en considérations:

    1. Le passage de type primitifs par référence n'est généralement pas utile, surtout ici où tu n'a visiblement aucune envie de modifier la valeur de j dans la fonction main(), ni de profiter de cette valeur modifiée.
    2. L'utilisation de va_list n'est généralement pas recommandée pour différentes raisons:
      • les fonctions peuvent être surchargées en C++ (tu peux avoir void foo(int), void foo(int, float, double) et void foo(int, const std::string&) dans le même programme, et dans la même unité de compilation)
      • Il est tout à fait possible de s'arranger pour qu'une fonctions puisse être "connectée" à elle-même (regarde, dans la FAQ, ce qui a trait à la surcharge des opérateur << et >> pour les flux, la méthode peut être adaptée à n'importe quelle fonction )
      • Si tu ne sais pas à l'avance quels arguments seront nécessaires pour permettre le fonctionnement de la fonction, il est peut être plus que temps de réfléchir à ce que tu veux qu'elle fasse
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Koo
    Koo est déconnecté
    Membre régulier Avatar de Koo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 76
    Points : 84
    Points
    84
    Par défaut
    Salut,

    J'avais posté dans le forum C, donc ce n'est pas un problème C++ . La surchage ne peut donc pas s'appliquer, d'autant plus que le nombre de paramètres peut être très grand.

    Citation Envoyé par koala01 Voir le message
    Le passage de type primitifs par référence n'est généralement pas utile, surtout ici où tu n'a visiblement aucune envie de modifier la valeur de j dans la fonction main(), ni de profiter de cette valeur modifiée.
    En effet je ne touche pas à i mais c'était uniquement pour l'exemple, car même sans utiliser ce paramètre le code ne fonctionne pas (ou plutôt mal).

    Quand à l'utilité de la fonction, celle-ci est uniquement là à titre "didactique" mon code n'ayant rien à voir et le problème contourné comme je 'lai dis avec un pointeur (et l'utilisation d'une ellipse justifiée). Cependant, je ne sais toujours pas pq ca ne marche pas avec une référence

  4. #4
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    En fait va_start va chercher l'adresse de son second argument (qui doit être le dernier argument avant ...) pour pouvoir récupérer les adresses des arguments suivants.

    Hors je pense qu'avec une référence, il va récupérer l'adresse de la véritable instance, qui n'est pas liée (au niveau de la mémoire) aux arguments suivants.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    308
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 308
    Points : 373
    Points
    373
    Par défaut
    Citation Envoyé par Koo Voir le message
    Salut,

    J'avais posté dans le forum C, donc ce n'est pas un problème C++ . La surchage ne peut donc pas s'appliquer, d'autant plus que le nombre de paramètres peut être très grand.
    Quand on écrit du code pour du C++, on ne poste pas dans un forum C, si tu tiens à utiliser "int & i" dans tes paramètres, ce n'est pas ici qu'il faut poser la question. Tout simplement parce que la réponse est spécifique au langage, surtout avec l'utilisation des fonctions à nombre d'arguments variables.

    De plus, si tu comptes afficher tous les paramètres passés en argument de ta fonction, c'est avec une boucle qu'il faut le faire, et il faut aussi prendre un point de repère pour savoir quand est-ce que la liste se termine, sinon tu tournera indéfiniment, ou bien jusqu'à ce que le programme te plante à la gueule, il n'y a pas de garde-fous dans ce système.

  6. #6
    Koo
    Koo est déconnecté
    Membre régulier Avatar de Koo
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 76
    Points : 84
    Points
    84
    Par défaut
    C'est vrai que les référence n'existe pas en C pur, autant pour moi. Sinon je pense que l'explication de MatRem est la bonne ce qui répond à ma question initiale.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Juste pour info et pour clore le chapitre du "pas à sa place":

    Le message a été déplacé (pas par moi ) dans le forum C++, en conséquence:
    • L'utilisation de références est légale pour le langage traité par le forum
    • Le fait que le message était à l'origine dans un autre forum n'importe à personne (perso, quand j'ai écrit ma réponse, le sujet se trouvait déjà dans le forum C++)
    • Toute remarque concernant le fait que l'utilisation de référence n'est pas légale en C n'a donc nullement sa place
    • (édit) la surcharge de fonction est légale en C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Problème de variable en référence dans une récursion
    Par Thabris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/02/2014, 16h10
  2. Réponses: 2
    Dernier message: 30/03/2009, 12h21
  3. Réponses: 6
    Dernier message: 08/10/2007, 13h50
  4. Utilisation de variables de Gui dans une fonction
    Par campofelliz dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 20/08/2007, 17h46
  5. Réponses: 6
    Dernier message: 18/04/2007, 11h47

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