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 :

declaration de variable dans un saut conditionnel


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut declaration de variable dans un saut conditionnel
    bonjour,
    je comprend mon erreur, je me demande juste s'il y'a un moyen de faire ce que je veu proprement:

    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
    if (type == "A") 
         {
                  map<llint, double>::const_iterator iter;
                  iter = a.end(); //menmbre prive d'une class dont cette fonction fait patie
                  }
         else
         {
                   map<llint, complet>::const_iterator iter;
         }
     
         if (type == "B") iter = b.end();
         if (type == "C") iter = c.end();
         if (type == "D") iter = d.end();
     
         curend = iter->first;
    a la compilation, on me retourne que dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (type == "B") iter = b.end();
    iter n'est pas declarer.
    y'a t'il un moyen de declarer une variable
    "dans une boucle conditionnel (if) qui aurai une poter globale (dans toute la fonction)"


    je m'excuse d'avance, je suis passablement fatigue,
    si vous avez besoin de presision n'hesiter pas.

    merci

  2. #2
    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
    Ben déjà tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    map<llint, double>::const_iterator iter;
     
    if (type == "A") iter = a.end();                  
    if (type == "B") iter = b.end();
    if (type == "C") iter = c.end();
    if (type == "D") iter = d.end();
    Tu peux aussi ne pas avoir besoin du constructeur par défaut si tu conçois ton code autrement.

    Par contre, iter->first c'est forcément mauvais : déréferencer un itérateur past-the-end est un comportement indéfini.
    Boost ftw

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    L'utilisation de boost Variant peut être une solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    boost::variant<map<llint, double>::const_iterator, map<llint, complet>::const_iterator> iter;
     
    if (type == "A")
    {
       iter = a.end(); //menmbre prive d'une class dont cette fonction fait patie
    }
    else
    {
         if (type == "B") iter = b.end();
         if (type == "C") iter = c.end();
         if (type == "D") iter = d.end();
    }

  4. #4
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    merci loufoque, mais je peu vraiment pas tous metre en <llint, double>.

    3Darchi, je connai pas boost,je voudrai alors savoir si l'utilisation de
    boost::variant
    m'oblige a modifier quelque chose d'autre dans le reste du code??

  5. #5
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    Par contre, iter->first c'est forcément mauvais : déréferencer un itérateur past-the-end est un comportement indéfini.
    mauvais?? en quoi c'est mal, ou alors comment on fait pour récupérer la valeur??

  6. #6
    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 neismarspra Voir le message
    "dans une boucle conditionnel (if) qui aurai une poter globale (dans toute la fonction)"
    Le probleme est que tu as l'air de desirer qu'une variable, iter, ait deux types differents. Ca c'est pas possible, il faut changer ta conception. Parmi les pistes de solution:
    - virer la raison pour laquelle iter devrait avoir deux types differents :-) Difficile de dire plus la dessus avec ce qu'on sait.
    - passer a un typage dynamique pour iter. boost::variant est le plus simple a mettre en oeuvre si tu utilises deja boost, quelque chose d'autre pourrait etre mieux (une classe de base et deux classes derivees,...), mais a nouveau ce genre de choix s'effectue en connaissant l'utilisation.
    - utiliser des templates et garder un typage statique. Difficile encre de dire plus sans en savoir plus sur l'utilisation d'iter.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 135
    Points : 83
    Points
    83
    Par défaut
    merci,

    j'utilise pas boost, mais je prend note.

    J'avais pas penser au template. Je crois que ce serra mon choix.

    entre temps j'ai utiliser la méthode cochon.

    merci a tous.

  8. #8
    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
    mauvais?? en quoi c'est mal
    Je l'ai déjà dit, comportement indéfini.

    alors comment on fait pour récupérer la valeur??
    map<llint, double> iter = a.end();
    iter--;

    par exemple.
    Tu peux aussi passer par un reverse iterator, a.rbegin()
    Boost ftw

Discussions similaires

  1. [Débutant] declarer plusieurs variables dans une boucle possible?
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 35
    Dernier message: 23/02/2010, 19h08
  2. Declaration de variables dans un boucle
    Par Nohatred dans le forum C
    Réponses: 17
    Dernier message: 07/09/2006, 11h51
  3. Réponses: 2
    Dernier message: 17/12/2005, 21h52
  4. Problème déclaration de variable dans un package
    Par LE NEINDRE dans le forum Modules
    Réponses: 3
    Dernier message: 23/08/2005, 19h26
  5. declarer une variable dans le query analyzer
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/03/2005, 12h26

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