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 :
// Dans la classe .cpp
void play()
{
//....sans importance
cout<<"Entrer une séquence de 81 entiers"<<endl;
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
cout<<endl;
cout<<"Cette phrase n'apparaît pas à l'écran"
for(i=0;i<81;i++)
{
a[i]=b[i]-48; (en gros on enlève 48 car 0 c'est 48 en ASCII)
}
}
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 ...
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...) 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 :
#include <iostream>
using namespace std;
int main()
{
int i;
char a[80];
int b[80];
cout << "Hello world!" << endl;
cin>>a;
cout<<a;
for(i=0;i<80;i++)
{
b[i]=a[i];
}
cout<<endl<<b;
return 0;
}
Ce code donne la sortie suivante :
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
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
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
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.