Se connecter / S'enregistrer
Votre question

C++ : Erreur de segmentation

Tags :
  • Programmation
Dernière réponse : dans Programmation
27 Août 2008 19:11:07

Bonjour à tous !

Je m'amuse à programmer en C++ avec g++ et comme je n'en n'ai pas fait depuis longtemps je rencontre un souci que je ne vois pas comment résoudre. J'ai envie de faire un solveur de sudoku (bon ça existe déjà, mais c'est histoire de faire passer le temps et c'est un bon moyen de se remémorer le langage C++)
Je sors volontairement la parcelle de code de son contexte. J'ai crée une classe qui contient 2 variables (tableaux) membres private : int a[81] et char b[81] et une (parmi d'autres) méthode void play()

A un moment, il faut entrer une séquence de 81 chiffres en lignes :
  1. // Dans la classe .cpp
  2. void play()
  3. {
  4. //....sans importance
  5. cout<<"Entrer une séquence de 81 entiers"<<endl;
  6. cin >> b; //on stocke la chaîne dans b, donc a priori pas de souci tant qu'on ne dépasse pas 81 caractères
  7. cout<<endl;
  8. cout<<"Cette phrase n'apparaît pas à l'écran"
  9. for(i=0;i<81;i++)
  10. {
  11. a[i]=b[i]-48; (en gros on enlève 48 car 0 c'est 48 en ASCII)
  12. }
  13. }

L'idée est de convertir une chaîne de caractère en entiers (déjà je ne sais pas si on peut faire ça vu qu'un char fait 1 octet et un int en fait 4 (il me semble...))

Bref, lorsque j'exécute le programme (le main consiste en un appel de objet.play() tout simplement) il me demande de rentrer la chaîne, je la rentre je fais "enter" et là il bloque et me met "Erreur de segmentation" sachant que la phrase "Cette phrase n'apparaît pas à l'écran" n'apparaît effectivement pas ...

Quelqu'un peut me dire d'où vient l'erreur ?


Merci beaucoup ;) 

Autres pages sur : erreur segmentation

a b L Programmation
27 Août 2008 20:32:15

Citation :
L'idée est de convertir une chaîne de caractère en entiers (déjà je ne sais pas si on peut faire ça vu qu'un char fait 1 octet et un int en fait 4 (il me semble...))

Il y a un cast implicite pour passer d'un entier "petit" à "grand".
La norme ANSI suggère aux compilateur de générer un warning dans le cas inverse (car la valeur peut être modifié à un modulo près).

Pour ton problème, est-ce qu'en utilisant une chaîne dynamique (avec un new dans le constructeur et un delete dans le destructeur), ça corrige le problème?

ps: à ta place j'utiliserais la STL
pps: pour les inlude tu as bien mis ceci (sans le .h)?
#include <iostream>
27 Août 2008 21:19:07

Oui oui il y a tout ça
#include <iostream>
#include "Csudoku.h" dans main.cpp et dans Csudoku.cpp

Sinon les tableaux dynamiques j'en garde de très mauvais souvenirs (des erreurs de partout surtout avec l'utilisation de classes, surement par manque d'expérience...:D ) Ici je connais à l'avance sa taille (81) donc je me disais que ce n'était pas nécessaire et bien plus simple.

Je précise que j'ai fait un programme type "hello world" où je demande de rentrer une chaîne de caractère et je n'ai pas eu de soucis tant que la taille entrée reste inférieure à la taille prévue (normal quoi).

PS : j'ai oublié de préciser que parfois j'ai une erreur qui me dit que je n'ai pas fait de "retour charriot" à la fin du fichier (main.cpp).

EDIT

Je rajoute qque chose :

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. int i;
  8. char a[80];
  9. int b[80];
  10. cout << "Hello world!" << endl;
  11. cin>>a;
  12. cout<<a;
  13.  
  14. for(i=0;i<80;i++)
  15. {
  16. b[i]=a[i];
  17. }
  18. cout<<endl<<b;
  19.  
  20. return 0;
  21. }

Ce code donne la sortie suivante :



Je ne comprend pas ce que m'affiche le cout<<b;
Contenus similaires
a b L Programmation
28 Août 2008 21:14:42

Avec les classes c'est simple, tu alloues dans le constructeur et le constructeur par recopie, tu désalloues dans le destructeur, et normalement il n'y a pas de problème.
Sinon tu peux utiliser la STL et la classe "string" qui fonctionne bien (et tu peux en extraire un const char * avec la méthode c_str() ).
C'est peut-être la déclaration du tableau statique en variable membre qui pose un problème d'allocation.

Citation :
PS : j'ai oublié de préciser que parfois j'ai une erreur qui me dit que je n'ai pas fait de "retour charriot" à la fin du fichier (main.cpp).

Normalement ce n'est pas une erreur mais un warning, c'est juste une question de compatibilité avec de mauvais compilateurs qui oublieraient la dernière ligne.

Citation :
Je ne comprend pas ce que m'affiche le cout<<b;

b est de type (int *), donc l'affichage est a priori impossible car contrairement au (char *) où l'on peut déterminer une fin à l'aide du caractère \0, avec un tableau int, on ne peut pas. Donc ça l'affiche comme un pointeur: ça affiche l'adresse mémoire où il est stocké. fait une boucle pour afficher chaque "int"
29 Août 2008 10:27:43

Citation :
b est de type (int *)

Pourtant je le déclare comme int b[80] (sans le *) ???
(Sinon tant pis, je ferai la boucle for)

Citation :
C'est peut-être la déclaration du tableau statique en variable membre qui pose un problème d'allocation.

Je crois me souvenir que je faisais cela sans pbs (à l'époque j'étais avec le compilateur de visual C++ 6), mas c'était il y a des années, j'ai eu le tps de tout oublier.

Mais de ttes façons je suis rentré de vacances, j'ai accès à mes bouquins maintenant, donc je devrais pouvoir résoudre ça (enfin j'espère).

Merci
a b L Programmation
29 Août 2008 19:46:20

Citation :
Pourtant je le déclare comme int b[80] (sans le *) ???
(Sinon tant pis, je ferai la boucle for)

Le C et C++ sont proche de la machine. Ton tableau n'est en fait qu'un pointeur qui pointe sur le premier élément du tableau en mémoire. Donc b est un tableau, mais c'est surtout un pointeur. On ne peut pas savoir la taille d'un tableau puisque ce n'est qu'une adresse mémoire et qu'il faudrait une structure de contrôle. L'avantage c'est qu'un int fait 4 octets et tu es certain qu'un int[80] prends 320 octets (pas un de plus).

Citation :
Je crois me souvenir que je faisais cela sans pbs (à l'époque j'étais avec le compilateur de visual C++ 6), mas c'était il y a des années, j'ai eu le tps de tout oublier.

Il est possible que ça vienne du compilateur g++ (enfin surtout de la bibliothèque sur les flux). Il faudrait regarder dans les sources :) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS