1. #1
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    mars 2009
    Messages
    494
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : mars 2009
    Messages : 494
    Points : 324
    Points
    324
    Billets dans le blog
    3

    Par défaut brelans carrés et autre traiterCarre

    re-bonjour à tous ,
    mes problèmes de compréhension de mon code continuent ....
    Pour ceux qui auraient suivi mon post précédent je n'ajoute que la fonction traiterCarre() que voici :
    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
     
    void traiterCarre(int index) {
        int nBrelan=0,nCarte,handValue,i,j;
        struct Carte *family;
     
        while(brelanCarre[index][nBrelan]) {
            fprintf(stdout,"index = %d\tnBrelan = %d\n",index,nBrelan);
            nCarte = 0;
            while((i = (brelanCarre[index][nBrelan] + nCarte)->rang)) {
                // Remplissage du tableau groups;
                family = getColor((brelanCarre[index][nBrelan] + nCarte)->color);
                (family + i)->used = index;// marquage de la carte dans groups et donne
                donne[(family + i)->place].used = index;// selon le niveau
                totaux[i]--;family->rang--;
                copyKill(family + i,groups);
                nCarte++;
            }
            if(brelanCarre[index+1]) {// d'autre carrés à traiter
                traiterCarre(index+1);
            }
            else {// l'évaluation de la main peut commencer
                setSuite(coeur);
                setSuite(trefle);
                setSuite(carreau);
                setSuite(pique);
                setNulle(coeur,carreau,trefle,pique);
                handValue = evalLowCost();
                if(handValue < defaultBest) {// on trouve une meilleure main
                    for(j=nulles[0].rang;j>0;j--) copyKill(nulles + j,bestHand);
                    defaultBest = handValue;
                }
            }
            afficheMain();
            // nouvelle main avec prise en compte des cartes marquées
            setMain_1(index);
            nBrelan += 1;// brelan suivant
        }
    }
    à l'exécution on se trouve avec un boucle sans fin;
    or, grâce au fprintf (avec \n en fin , merci Sve@r) , les valeurs de "index" et de "nBrelan" restent à zéro ?!
    Je trouve cela plutôt anormal car soit :
    1) appel récursif de traiterCarre => index+1
    2) pas d'appel récursif => nBrelan+1
    Quel est le problème ?

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 6 309
    Points : 17 714
    Points
    17 714
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par exe2bin Voir le message
    soit :
    1) appel récursif de traiterCarre => index+1
    2) pas d'appel récursif => nBrelan+1
    Quel est le problème ?
    Bonjour
    tu as oublié
    soit:
    3) appel récursif (parce que brelanCarre[index+1] ne vaut pas 0) mais dans la seconde instance pas d'entrée dans la boucle (parce que brelanCarre[index][nBrelan] vaut aussi 0).
    Et donc ta boucle infinie est due à la fonction parente qui boucle en appelant à chaque fois la fonction traiterCarre()...

    Attention à la ligne while((i = (brelanCarre[index][nBrelan] + nCarte)->rang)) car il y a un jeu de parenthèses ouvrante et fermantes en trop (celui des extrémités). De plus, cette instruction (brelanCarre[index][nBrelan] + nCarte)->rang est difficilement lisible alors qu'elle équivaut à brelanCarre[index][nBrelan][nCarte]->rang.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

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

Discussions similaires

  1. Remplir un carré d'une couleur & autres
    Par Maxstor dans le forum Assembleur
    Réponses: 0
    Dernier message: 13/01/2012, 16h07
  2. Réponses: 1
    Dernier message: 15/11/2009, 23h21
  3. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  4. Réponses: 2
    Dernier message: 21/05/2002, 10h25
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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