Bonjour,
la compilation de mon programme produit un seg fault.
Les soucis se trouvent dans la classe Plage mais je ne sais pas trop comment corriger ça:
Merci
Bonjour,
la compilation de mon programme produit un seg fault.
Les soucis se trouvent dans la classe Plage mais je ne sais pas trop comment corriger ça:
Merci
L'exécution, pour être exact.la compilation de mon programme produit un seg fault.
Tu as comme qui dirait un dépassement de capacité.#define NBCOLONNES 100
...
colonne=126945
Après, il faudrait afficher la pile d'appels pour voir d'où vient cette valeur.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Cette pile s'affiche avec quelle commande ?Envoyé par Laurent Gomila
Avec gdb, c'est "backtrace" ou en abrégé "bt", si mes souvenirs sont bons.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Salut
j'ai pas lu tout le code mais il me semble que ta fonction hasard() est douteuse
le cas d erreur est rand() == RAND_MAX il me semble que tu seras en dehors des bornes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int Plage::hasard(int min, int max){ return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1))); }
perso j'utiliserais plutot un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part min +(rand() % (max-min))
si tu es sous un unix (linux) utilises valgrind ca te fera gagner du temps![]()
Outre la fonction de random, il me semble que les fonctions "entrée" et "sortie" le sont aussi...
Je sais bien que les compilateurs sont très bons, et qu'il peuvent detecter des recursions inutiles (en fin de fonction par exemple), mais là c'est typiquement le cas, ou la recursion ne sert qu'à remplir la pile... D'autant qu'on peut, exploser la pile très vite si on appelle entrée avec une seule cellule libre ou sortie avec une seule cellule occupée
Une simple boucle while autour des appels serait plus "sur" à mon avis (quitte à faire tourner le processus en boucle infinie, au moins sa explosera pas la pile).
Genre (pseudocode):
Ensuite, je me demande dans quelle mesure la selection d'une ligne et d'une colonne par double appel à rand() est valable.
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 entree(ligne, colonne) { if (nb_libre == 0) return; do { if (cellule[ligne,colonne]) { cellule[ligne,colonne]=false; nb_occupees++; return; } ligne = random(); colonne = random(); } while(true) }
rand() est censé retourner tous les éléments possible au moins une fois avant de boucler. Mais rien ne dit qu'il le fait deux fois avec un nombre d'impair d'appels entre les deux.
Ce que j'entends par là, c'est que des "pattern" peuvent apparaitrent et rien ne dit que toutes les lignes/colonnes seront touchées par un double appel.
Bien entendu, ce cas est d'autant plus fréquent que le nombre de lignes/colonnes augmente. Et dans ce cas, la fonction a de fortes chances de boucler.
Attention aussi à l'utilisation de rand() conjointement à un modulo... le résultat n'est pas sur d'être random non plus !
Si la mémoire n'est pas un probleme, allouer deux vecteurs additionels: un pour les cellules libres, l'autre pour les cellules occupées. Quand une cellule change de mode elle passe d'un vecteur (tableau) à un autre.
La selection aléatoire n'a besoin d'être faite qu'une seule fois sur la longueur du tableau voulu (on est sur que la cellule est du bon type dans ce cas là).
Partager