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 :

comparaison+affectation dans une boucle


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut comparaison+affectation dans une boucle
    Bonjour,

    J'ai ce code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(true)
    {
       model=octreeManager->getNextModel();
       if(model==NULL)
          break;
       model->draw();
    }
    Ma question simple : est-il possible de réduire le nombre ligne de ce code ? Il me semblait de mémoire que l'on pouvait faire une affectation et une comparaison dans la condition d'une boucle mais je n'y arrive pas !

    Quelque chose du genre mais qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while(model = octreeManager->getNextModel() != NULL)
      model->draw();
    Possible ? Impossible ? merci d'avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Tu as essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while( model = octreeManager->getNextModel() )
      model->draw();
    ?

    Et sinon tu obtiens quoi comme erreur ? Avec quel compilateur ?

    MAT.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Grrr, j'avais déjà testé ton code mais ça ne fonctionnait pas à cause d'une erreur qui se trouvait autre part, désolé du dérangement

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Moi j'aime bien ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(true)
    {
       model=octreeManager->getNextModel();
       if(model==NULL)
          break;
       model->draw();
    }
    par rapport à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while(model = octreeManager->getNextModel() != NULL)
      model->draw();
    Il a l'avantage dêtre plus lisible, plus facile à comprendre, a débugger, à modifier et je suis sûr qu'au bout du compte c'est le même code qui est généré par le compilateur et l'optimiseur.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    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,

    La question me semble très mal posée, pour tout te dire...

    En effet, le nombrer de ligne n'importe le plus souvent que peu au compilateur... mais importe énormément à la personne qui le lit.

    En effet, si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction1();fonction2();fonction3();
    cela revient exactement au même, du point de vue du compilateur, que si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fonction1();
    fonction2();
    fonction3();
    Mais la lisibilité du code est bien meilleure dans la seconde version que dans la première.

    Or, s'il y a un principe qu'il faut garder en tête en permanence (à vrai dire, il y en a plus d'un, mais il y en a un en particulier qui vaut la peine d'être rappelé dans ce contexte ), c'est qu'un code source est beaucoup plus souvent lu qu'il n'est écrit/compilé.

    Et, sur base de ce principe, on peut t'assurer que la seconde version sera toujours préférable à la première, car la première risque fort d'enduire le lecteur d'horreur... Pardon: de l'induire en erreur

    Maintenant, si la question est
    Est-il possible d'améliorer l'algorithme, et, partant de là, de diminuer le nombre d'instruction, et donc les performance de cette boucle
    la réponse est oui, sans aucun doute

    Mais, pour garder un minimum de sécurisation de l'exécution, le code correspondant au "meilleur algorithme" prendrait sans doute la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    model=octreeManager->getFirstModel();
    while(model)
    {
        model->draw();
        model=model->getNextModel();
    }
    voir (étant donné que les boucles sont interchangeables) de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(model=octreeManager->getFirstModel();
         model!=NULL;
         model=model->getNextModel())
    {
        model->draw();
    }
    en partant des prérequis que:
    • getFirstModel() renvoie un pointeur compatible avec model pointant sur le premier élément de la collection
    • getNextModel() renvoie un pointeur compatible avec model pointant sur l'élément de la collection qui suit celui en cours ou NULL si l'élément en cours est le dernier élément de la collection

    Nous pourrions aussi, si nous avions la certitude que model est un pointeur valide au départ, envisager de travailler sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    do
    {
        model->draw();
        model=model->getNextModel();
    }while(model);
    voire, s'il nous est impossible d'avoir cette certitude (car model serait passé en paramètre, par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(model)
    {
        do
        {
            model->draw();
            model=model->getNextModel();
        }while(model);
    }
    Tous ces exemples fournissent des algorithmes qui sont a priori bien meilleur que celui que tu propose comme code de départ, tout en fournissant un résultat final exactement identique (et, pour certain... nécessitant plus de lignes de code, si on considère les retours à la lignes du fait des accolades... c'est un comble non ) mais en préservant malgré tout un niveau de visibilité correct

    Maintenant, si tu souhaites que nous t'aidions à choisir celui qui sera le plus adapté à ton cas particuliers, il faudra nous en dire un peu d'avantage
    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

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par koala01 Voir le message
    ...
    • getFirstModel() renvoie un pointeur compatible avec model pointant sur le premier élément de la collection
    • getNextModel() renvoie un pointeur compatible avec model pointant sur l'élément de la collection qui suit celui en cours ou NULL si l'élément en cours est le dernier élément de la collection

    ...
    • getFirstModel() renvoie un pointeur compatible avec model pointant sur le premier élément de la collection ou NULL si la collection est vide

    Sinon, je suis totalement d'accord
    +1
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  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
    Citation Envoyé par ram_0000 Voir le message
    • getFirstModel() renvoie un pointeur compatible avec model pointant sur le premier élément de la collection ou NULL si la collection est vide

    Sinon, je suis totalement d'accord
    +1
    Effectivement...

    Ces sept mots supplémentaires sont restés dans mon clavier et sont pourtant tres importants
    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. Comparaison dans une boucle
    Par dam28800 dans le forum Langage
    Réponses: 20
    Dernier message: 13/11/2008, 14h27
  2. [Template] Comment affecter une variable dans un include dans une boucle
    Par Daxou31 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/10/2008, 15h03
  3. [ANT] affectation de variables dans une boucle
    Par dino_xrc dans le forum ANT
    Réponses: 6
    Dernier message: 17/12/2007, 19h47
  4. [SQL] Affectation d'une variable dans une boucle
    Par monlam dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/10/2007, 14h41
  5. [Smarty] Affectation dans une boucle PHP
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/08/2006, 09h30

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