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 avec une boucle for


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Problème avec une boucle for
    Bonjour,

    Probablement une question très conne, mais j'ai beau chercher je ne trouve pas. Et comme j'ai meme du mal à formuler la question que "Ouinnn pourquoi ça ne marche pas ?" je n'arrive pas à obtenir une réponse pertinente de google.

    J'ai un petit bout de code qui marche exactement comme je le désire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        uint64 main1, main2;
        main1 = cardindex2[51] | cardindex2[50];
        main2 = cardindex2[47]  | cardindex2[46];
        int win1(0), win2(0), draw(0), nbredeboards(0);
        hePfEquityEval2Hands(main1, main2, &win1, &win2, &draw, &nbredeboards);
    Mon but est de faire une boucle pour estimer la vitesse du code. J'ai donc voulu faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        uint64 main1, main2;
        main1 = cardindex2[51] | cardindex2[50];
        main2 = cardindex2[47]  | cardindex2[46];
        int win1(0), win2(0), draw(0), nbredeboards(0);
        int d;
        for (d=0; d++; d < 100)
        {
            win1=0;
            win2=0;
            draw=0;
            nbredeboards=0;
            hePfEquityEval2Hands(main1, main2, &win1, &win2, &draw, &nbredeboards);
        }
    Et là c'est le drame. Les valeurs obtenues sont absurdes. Genre il se fout du fait que je réinitialise à 0 la valeur des compteurs dans le for.

    Merci de me lire, et encore plus si vous avez une réponse. J'espère que c'est une faute conne d'inattention ou de syntaxe.

    Pour info :
    Système : windows 7 64bits
    EDI : QT
    Compilateur : MSVC 2012 64 bits.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 174
    Points
    10 174
    Par défaut
    c'est la première fois que je fois ce genre de syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int win1(0), win2(0), draw(0), nbredeboards(0);
    pour ma part c'est mieux si tu faisais.
    Sinon pour ton erreur au lieu écrire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (d=0; d++; d < 100)
    il faut écrire cela :

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 780
    Points
    23 780
    Par défaut
    Bonjour et bienvenue,

    Deux petits détails :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            int win1(0), win2(0), draw(0), nbredeboards(0);
    … cette syntaxe est celle des constructeurs du C++ et n'est pas valide en C, même si la plupart du temps, les compilateurs le font quand même car la plupart d'entre eux sont faits pour compiler les deux langages en l'absence d'options rendant la compilation plus stricte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       for (d=0; d++; d < 100)
    … Les deux derniers paramètres sont inversés dans cette déclaration. Il aurait fallu écrire for(d=0; d < 100; d++). Cependant, c'est une expression qui reste tout-à-fait légale. À chaque tour de boucle, ton programme évalue l'expression « d++ » et vérifie si elle est vraie pour continuer. Dans le cas présent, d est initialement égal à zéro et, donc, la boucle ne devrait jamais s'exécuter (même pas le premier tour). Avec une autre valeur initiale de d (toujours vraie car différente de zéro), la boucle tournerait en permanence parce d et d+1 seraient toujours vrais, convertis en booléens. La boucle finirait par s'arrêter quand même après un dépassement de capacité qui ferait revenir d à zéro (après être passé par tous les nombres négatifs puisque d est signé).

    (Edit: grillé aussi).

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    oh mince, je me doutais que c'était une question idiote d'inattention mais alors à ce point. Merci beaucoup ça fait 1 heure que je regarde mon code en me demandant comment faire.

    Sinon pour la syntaxe je ne sais honnêtement plus où j'ai vu ça. Je me disais juste que c'était pratique pour initialiser plusieurs variables d'un coup.

    PS : ok pour la syntaxe, j'ai du effectivement voir ça dans un tuto C++. Je vais corriger ça de suite.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 780
    Points
    23 780
    Par défaut
    Citation Envoyé par Personne74 Voir le message
    Sinon pour la syntaxe je ne sais honnetement plus où j'ai vu ça. Je me disais juste que c'était pratique pour initialiser plusieurs variables d'un coup.
    En C++. C'est assez courant.
    Cependant, tu peux quand même initialiser plusieurs variables en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int win1=0, win2=0, draw=0, nbredeboards=0;

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 225
    Points : 10 174
    Points
    10 174
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    (Edit: grillé aussi).
    Peut être grillé mais tu as toujours fait effort de tout bien expliqué et c'est plutôt agréable
    Pour la syntaxe ben tu m'as au moins éclairé sur ce point et vu que je fais peu de C++ normal que je n'ai jamais vu ce genre de syntaxe , après pour la boucle for vu que c'est une faute inattention je n'ai pas expliqué plus que cela , c'est comme les if(a = b) qu'on peut voir c'est valide mais c'est en général non voulu.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Peut être grillé mais tu as toujours fait effort de tout bien expliqué et c'est plutôt agréable
    Pour la syntaxe ben tu m'as au moins éclairé sur ce point et vu que je fais peu de C++ normal que je n'ai jamais vu ce genre de syntaxe , après pour la boucle for vu que c'est une faute inattention je n'ai pas expliqué plus que cela , c'est comme les if(a = b) qu'on peut voir c'est valide mais c'est en général non voulu.
    Tu rigoles mais c'est exactement ça...


    Là où je m'en veux sur les for c'est que c'est pas comme si j'en avais jamais fait de ma vie (Cf le code plus bas). Par contre je n'avais fait cette erreur.

    Dans le genre la dernière fois que j'ai mis 1 heure à me taper la tete contre les murs c'était exactement ça le problème : la fonction hePfEquityEval2Hands que j'appelle dans le code précédent c'est ça :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    void hePfEquityEval2Hands(uint64 main1, uint64 main2, int *win1, int *win2, int *draw, int *nbredeboards)
    {
        uint64 board;
        int eval1, eval2;
        int i,j,k,l,m;
        for (i=4; i <52; i++)
        {
            for (j=3; j < i; j++)
            {
                for (k=2; k < j; k++)
                {
                    for (l=1; l < k; l++)
                    {
                         for (m=0; m<l; m++)
                         {
                            board = cardindex2[i] | cardindex2[j] | cardindex2[k] | cardindex2[l] | cardindex2[m];
                            if (!((main1 | main2) & board))
                            {
                                (*nbredeboards)++;
                                eval1 = eval7card((main1 | board));
                                eval2 = eval7card((main2 | board));
                                if (eval1 > eval2)
                                {
                                    (*win1)++;
                                }
                                else if (eval1 == eval2)
                                {
                                    (*draw)++;
                                }
                                else if (eval1 < eval2)
                                {
                                    (*win2)++;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    J'avais par inadvertance mis eval1 = eval2 au lieu du bon code. Comme tu t'en doutes j'avais le bon nombre de win1 mais pour le reste... Et puis les (*win)++ à la place des *win++ ça m'a bien pris la tete aussi.

    Bon j'imagine que c'est le genre de connerie qu'on en fait qu'une fois. J'en ai encore beaucoup d'autres dans le genre ?

    En tout cas merci à vous deux pour les réponses rapides et efficace et le petit plus en syntaxe/culture G sur le C/C++.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Au moins de nos jours on a des compilos qui tendent à signaler les if(a = b) avec un warning. Ainsi, quand c'est voulu, on écrit la version longue qui montre bien à la fois au compilo et au lecteur que c'est voulu:

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 780
    Points
    23 780
    Par défaut
    Citation Envoyé par Personne74 Voir le message
    Tu rigoles mais c'est exactement ça...

    Là où je m'en veux sur les for c'est que c'est pas comme si j'en avais jamais fait de ma vie (Cf le code plus bas). Par contre je n'avais fait cette erreur. […] J'avais par inadvertance mis eval1 = eval2 au lieu du bon code. Comme tu t'en doutes j'avais le bon nombre de win1 mais pour le reste... Et puis les (*win)++ à la place des *win++ ça m'a bien pris la tete aussi.

    Bon j'imagine que c'est le genre de connerie qu'on en fait qu'une fois. J'en ai encore beaucoup d'autres dans le genre ?
    Ne t'inquiète pas, ça arrive à tout le monde. Dans le même genre, il y en a une pas mal également, surtout quand on tape de manière « automatique », par habitude :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for (i=0;i<10;i++);
        {
            mon code…
        }

    … ce n'est pas que ça ne marche pas : on rentre bien dans le code de la boucle et le code s'exécute comme il faut mais : une seule fois ! pas zéro, pas une infinité, juste une seule ! Le plus fort dans l'histoire, c'est que l'indice, lui, est bien actualisé comme il faut : il vaut bien 10 après le corps de la boucle. Et là où ça devient fou, c'est que même lorsque la condition est toujours fausse, le bloc s'exécute quand même… une fois !

    Évidemment, à tête reposée et avec un bloc de trois lignes, c'est trivial ou presque. Mais un vendredi soir, quand on a l'esprit fatigué et que le corps de la fonction s'étend sur plusieurs pages, on en vient sérieusement à envisager un bug du compilateur… :-)

  10. #10
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Alors celle-la je la note et je la garde en tête. En espérant m'en souvenir quand cela va m'arriver. Je sens que tu m'as par avance évité une bonne prise de tête.

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for (i=0;i<10:i++);
        {
            mon code…
        }
    … ce n'est pas que ça ne marche pas : on rentre bien dans le code de la boucle et le code s'exécute comme il faut mais : une seule fois ! pas zéro, pas une infinité, juste une seule !
    Ca m'a laissé perplexe puis j'ai compris qu'il y avait une coquille, il s'agit bien sûr de:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       for(i=0;i<10;i++);
       {
         mon code...
       }

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 780
    Points
    23 780
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Ca m'a laissé perplexe puis j'ai compris qu'il y avait une coquille, il s'agit bien sûr de:
    Bien vu !

  13. #13
    Invité
    Invité(e)
    Par défaut
    Pas contre on fera attention à ne pas laisser de ';' "superflus" trainer ou on risque d'avoir d'autres surprises

  14. #14
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Pas contre on fera attention à ne pas laisser de ';' "superflus" trainer ou on risque d'avoir d'autres surprises
    Bien sûr, mais ce ';' là n'était pas une coquille dans le post en question sinon, il n'a plus de sens.

  15. #15
    Membre régulier Avatar de JulieCarree
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 50
    Points : 94
    Points
    94
    Par défaut conclusion

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

Discussions similaires

  1. Problème avec une boucle for
    Par Zaza91280 dans le forum MATLAB
    Réponses: 12
    Dernier message: 13/05/2010, 17h56
  2. Problème avec une boucle for
    Par nostalamigo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/03/2009, 23h26
  3. Réponses: 6
    Dernier message: 26/11/2007, 15h25
  4. problème avec une boucle For
    Par mademoizel dans le forum ASP
    Réponses: 3
    Dernier message: 24/03/2007, 13h20
  5. Problème avec une boucle for
    Par cisse18 dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 29/03/2006, 16h50

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