Tom's Guide > Forum > Programmation > C++ : Erreur de segmentation
Mot :    Pseudo :           
 

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 :

Code :
  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 ;)

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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>


Message édité par CRicky le 27-08-2008 à 20:35:08
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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 :

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


Ce code donne la sortie suivante :

 

http://nsa02.casimages.com/img/2008/08/27/mini_080827093749948799.png

 

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


Message édité par abel_b le 27-08-2008 à 21:37:25
------------------------------ Ce que nous ignorons a plus d’influence sur nos vies que ce que nous savons
Répondre à abel_b

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"


Message édité par CRicky le 28-08-2008 à 21:19:34
------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

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

------------------------------ Ce que nous ignorons a plus d’influence sur nos vies que ce que nous savons
Répondre à abel_b

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 :)

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Tom's Guide > Forum > Programmation > C++ : Erreur de segmentation
Aller à :

Il y a 2214 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens