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 :

Boucle for en C transposer en C++ moderne


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut Boucle for en C transposer en C++ moderne
    Bonjour,

    Je voudrais savoir comment on traduit ces 2 boucles for qui sont en C en C++ moderne.

    Code C à traduire en C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define TET_AREA_LG 16	
    #define TET_AREA_HT 25
     
    #define TET_DRAW_LG 10	
    #define TET_DRAW_HT 18
     
    #define TET_GFX_OFFSX	26	// Offset aire de jeu.
    #define TET_GFX_OFFSY	12
     
    u8    pArea[TET_AREA_LG * TET_AREA_HT];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    for (i = 0; i < TET_AREA_HT; i++)
    {
      gTetris.pArea[2 + (i * TET_AREA_LG)] = 1;
      gTetris.pArea[3 + TET_DRAW_LG + (i * TET_AREA_LG)] = 1;
    }
    et

    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
     
    u32 x, y;
    u32 nVal;
     
    // Parcours de l'aire de jeu.
    for (y = 0; y < TET_DRAW_HT; y++)
    {
      for (x = 0; x < TET_DRAW_LG; x++)
      {
        nVal = gTetris.pArea[((y + 4) * TET_AREA_LG) + (x + 3)];
        if (nVal)
        {
    	DrawBlockGfx((x * 12) + TET_GFX_OFFSX, (y * 12) + TET_GFX_OFFSY, nVal - 1);
        }
      }
    }
    Il y a plusieurs choses qui me pose problème, c'est dans pArea le calcule de l'index car si j'utilise en C++ modern
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(auto & i: gTetris.pArea)
    bin je ne peux pas faire le calcule de mon index me semble t-il de plus il y a le parcours de pArea avec la boucle imbriqué donc là c'est pareille je vois pas trop comment faire il me semble que je ne peux pas faire 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(auto & y : gTetris.pArea){ for(auto & x : gTetris.pArea) {}}
    j'avais éventuellement pensé passé par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::array<std::array<u8, TET_DRAW_LG>, TET_DRAW_HT> pArea;
    puis faire les 2 boucles for C++ moderne au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::array<u8, TET_AREA_LG * TET_AREA_HT> pArea
    Donc si vous avez une idée.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu peux utiliser std::array au lieu d'un C-array.
    Et puis c'est tout.
    Il n'y a pas moyen de ne pas faire les boucles en incrémentant les compteurs, parce qu'ils sont utilisés pour faire des calculs d'offset.
    Vouloir écrire du code plus moderne doit se faire avec du bon sens. Et ce n'est pas parce que c'est plus moderne que les autres façons de faire sont obsolètes et doivent être évitées/supprimées.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

    Avant toute chose, il faut comprendre que les range based loops (les boucle de type for(type /* & */ element : collection)) n'ont vraiment un intérêt que lorsqu'il est réellement question d'itérer sur les élément de la collection, et que la notion d'indice de l'élément manipulé n'est que "secondaire".

    Si, comme c'est le cas ici, tu as besoin de l'indice pour une raison ou une autre, c'est soit que les ranged based loops ne sont pas l'outil qu'il te faut pour apporter la solution que tu cherches, soit que tu dois trouve "une autre solution" pour pouvoir disposer de cet indice (au besoin, en réorganisant "autrement" tes données, de manière à rendre le besoin de disposer d'un indice secondaire).

    Tu ** pourrais ** éventuellement avoir un intérêt quelconque à travailler sous une forme qui serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    size_t index{0}; // l'indice du début
    for(auto /* & */ elem : collection){
        /* on fait tout ce que l'on a à faire 
         * ...
         */
      ++index; // on passe à l'indice suivant
    }
    Cependant, à par le plaisir d'utiliser une range based loop, ce genre de code n'a -- à mon sens -- aucun avantage sur les bonnes "vieilles boucles à l'ancienne", basées sur un indice, qui restent malgré tout parfaitement utilisables
    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

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    D'accord merci à tous les 2 pour vos éclaircissements, comme j'apprends le C++ moderne je pensais qu'on devait obligatoirement abandonner les anciennes méthodes.

  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
    Ben non...

    Les "nouvelles méthodes" sont proposées parce qu'elles présentent un intérêt certain dans certaines circonstances, un peu comme on pourrait proposer l'utilisation d'une visseuse au lieu d'un tournevis.

    Seulement, ben, il y a des cas dans lesquels l'utilisation d'une visseuse ne sera pas forcément très pratique et dans lesquels l'utilisation d'un tournevis s'avérera au final plus pratique et plus facile.

    Il n'y a aucune raison à se faire du mal inutilement, n'est-ce pas Il ne faut pas faire fou qui se tape sur la tête et à qui on demande pourquoi il fait cela, répond "mais cela fait tellement de bien quand ça s'arrête"

    C++ n'est jamais qu'un langage, et les langages ne sont jamais que des outils, ou plutôt, des boites à outils.

    On s'arrange pour que les outils fournis soient aussi efficace et sécurisant à l'emploi que ce que l'utilisateur est en droit d'attendre de la part de ces outils. Mais il reste libre de choisir l'outil qui sera le plus efficace pour combler le besoin auquel il est confronté
    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
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 431
    Points : 172
    Points
    172
    Par défaut
    Merci pour ta réponse. Après pas évident de savoir quand utiliser quoi, c'est avec l'xp. Perso je serai plutôt le gars qui ferai que des tableaux de type C mais bon faut ce forcé aussi

    Citation Envoyé par koala01 Voir le message
    Il n'y a aucune raison à se faire du mal inutilement, n'est-ce pas Il ne faut pas faire fou qui se tape sur la tête et à qui on demande pourquoi il fait cela, répond "mais cela fait tellement de bien quand ça s'arrête"

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/10/2014, 14h45
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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