Boucle infinie lorsque j'enlève un certain printf

a marqué ce sujet comme résolu.

ça peut venir d'une optimisation du compilateur, le printf est la seule lecture de la variable, il supprime les lignes 12 à 16 et donc entre constamment dans le if. (je suppute mais je vois pas trop d'autres raisons, il faudrait comparer l'assembleur des deux codes)

j'ai la boucle infinie même avec le printf, donc le problème vient d'ailleurs.

+0 -0

bon, je n'ai plus la boucle infinie. Elle se produisait car grille était mal initialisée. Voilà mon code, plus de boucle infinie, avec ou sans le printf.

 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <stdlib.h>

typedef enum{
    HAUT_GAUCHE,
    HAUT,
    HAUT_DROITE,
    DROITE,
    BAS_DROITE,
    BAS,
    BAS_GAUCHE,
    GAUCHE,
    UNDEFINED_DIRECTION,
}Direction;

typedef enum{
    ROUGE,
    BLEU,
    VERT,
    UNDEFINED_COULEUR,
}Couleur;

typedef struct{
    Direction direction;
    Couleur couleur;
}Case;

int main()
{
    int i = 0;
    int lasers = 3;
    int alea, colonne, ligne, hauteur = 5, max = 25;

    Case grille[5][5];
    for (int i = 0;i < max;i++)
    {
        colonne = i / hauteur;
        ligne = i % hauteur;

        grille[colonne][ligne].direction = UNDEFINED_DIRECTION;
        grille[colonne][ligne].couleur = UNDEFINED_COULEUR;
    }

    while(i < lasers){
        alea = (rand() % max);
        colonne = alea / hauteur;
        ligne = alea % hauteur;
        if(grille[colonne][ligne].direction != UNDEFINED_DIRECTION){
            printf("DEJA FAIT ! %d %d\n", i, alea);
            continue;
        }

        alea = (rand() % 8);
        grille[colonne][ligne].direction = alea;
        alea = (rand() % 3);
        grille[colonne][ligne].couleur = alea;
        printf("couleur : %d\n", grille[colonne][ligne].couleur);

        i++;

    }
    return 0;
}

Salut,

Le morceau de code que tu fournis ne présente pas de problème apparent. À vue de nez, tu dois avoir un comportement indéfini dans l'histoire, ce qui expliquerait le fonctionnement aléatoire de ton programme. Pourrais-tu nous fournir un code complet fonctionnel, c'est-à-dire qui peut être compiler et tester directement ?

+0 -0

Ce n'est vraiment pas la peine que je partage mon code, j'ai copié-collé celui de minirop dans un nouveau projet de Code::Blocks et pareil, si je commente le printf, j'ai une boucle infinie.

SparklingFire

Certes, mais il t'a précisé que le sien ne fonctionnait pas parce que le tableau grille n'est pas initialisé. Est-ce pareil si tu modifies son code en réalisant une initialisation correcte ? Si oui, peux-tu nous montrer ce code modifié ?

+0 -0

Le code qu'il a fourni est donc après qu'il l'ait modifié pour que l'initialisation soit correcte. J'ai testé son code ainsi que le mien dans un IDE en ligne ainsi que dans Microsoft Visual Studio et les 2 codes fonctionnent sans aucun problème. Mon problème vient vraiment de Code::Blocks et non du code donc inutile de perdre du temps. Merci à vous 2 et désolé du dérangement.

SparklingFire

Ou alors "undefined behavior" ça veut dire ce que ça veut dire et le code est juste tombé en marche …

Erreur typique d'une UB, généralement de type corruption de la mémoire. Ce n'est pas C::B qui fait n'importe quoi, c'est juste que le mode Debug de VC++ est parfois trop gentil avec nous, et qu'il y a un très vilain bug dans ton code.

Bref, fait tourner ton code sous valgrind, ou mieux avec un sanitizer (clang, ou gcc très récent) – sous Windows, je sais que le dernier VC++ intègre clang, mais je n'ai pas encore essayé la sanitization avec lui.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte