probleme de classe

probleme de classe - C++ - Programmation

Marsh Posté le 11-10-2004 à 20:27:05    

salut je suis au debut d'un projet de calculette et j'ai commencé ma classe en y implementant les additions , mais deja la ca ne marche pas , et je ne comprends pas :sweat:
 
voici mon code (je compile avec g++) :
 

Code :
  1. #include <cmath>
  2. #include <cstring>
  3. using namespace std;
  4. class calc
  5. {
  6. public:
  7. void newcalc(string nstr);
  8. float getresult();
  9. private:
  10. string::size_type lpos;
  11. float result;
  12. };
  13. void calc::newcalc(string nstr)
  14. {
  15. float cumulr=0;
  16. string ustr=nstr;
  17. while(1)
  18. {
  19. //
  20. if(calc::lpos = ustr.find(" + ",0))
  21. {
  22. break ;
  23. }
  24. //
  25. string::size_type ppos = ustr.find(" + ",0);
  26. calc::lpos = ppos;
  27. string nb = ustr.substr(ppos,3);
  28. ustr.erase(0,(ppos+2));
  29. char nbc[100] = nb.c_str();
  30. cumulr += atof(nbc);
  31. calc::result = cumulr;
  32. }
  33. }
  34. float calc::getresult()
  35. {
  36. float tres = calc::result;
  37. return tres;
  38. }


 
 
merci de votre aide :jap:


---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 11-10-2004 à 20:27:05   

Reply

Marsh Posté le 11-10-2004 à 20:27:44    

l'indentation est en option chez toi?
 
pourquoi tu fais pas une méthode dédiée à l'addition? [:spamafote]
c'est quoi ce while(1) tout pourri?
[Taz]atof c'est mauvais, utilises les stringstreams[/Taz]


Message édité par masklinn le 11-10-2004 à 20:31:05

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-10-2004 à 20:31:16    

rhaa le getresult, c'est bof bof, ça te plairait pas de pouvoir faire des conversion (implicites si tu le veux) en float pat simple cast ?
 
 
newcalc -> écris un constructeur

Reply

Marsh Posté le 11-10-2004 à 20:48:24    


Aille.  
c_str() te renvoie un const char *. C'est un pointeur vers une zone mémoire qui appartient à ta chaîne nb. Il est donc hors de question de faire ça:

Code :
  1. char nbc[100] = nb.c_str();


Surtout que stringstream existe...

Reply

Marsh Posté le 11-10-2004 à 20:57:25    

sinon mshome, ton gros problème ça va être l'algorithme. Tu ferais bien de faire une version simple en  pré/post-fixé et gérer ça avec une pile. C'est un exercice très commun

Reply

Marsh Posté le 11-10-2004 à 20:59:52    

Lam's a écrit :

Aille.  
c_str() te renvoie un const char *. C'est un pointeur vers une zone mémoire qui appartient à ta chaîne nb. Il est donc hors de question de faire ça:

Code :
  1. char nbc[100] = nb.c_str();


Surtout que stringstream existe...


 
je remplace par quoi alors ?


---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 11-10-2004 à 21:00:50    

par
 
#include <sstream>
 
istringstream is(nb);
nb >> f; // pareil qu'avec cin

Reply

Marsh Posté le 11-10-2004 à 21:02:33    

Lam's a écrit :

Aille.  
c_str() te renvoie un const char *. C'est un pointeur vers une zone mémoire qui appartient à ta chaîne nb. Il est donc hors de question de faire ça:

Code :
  1. char nbc[100] = nb.c_str();


Surtout que stringstream existe...


 
je sais que c'est mal en c++, mais quand je fais
 
char tab[100] = "hello";
 
j'initialise bien mon tableau avec un const char * ?

Reply

Marsh Posté le 11-10-2004 à 21:04:39    

non, c'est un sucre synthaxique qui équivaut à { 'h', 'e', 'l', 'l', 'o', '\0' ... }

Reply

Marsh Posté le 11-10-2004 à 21:06:00    

oue, ok

Reply

Marsh Posté le 11-10-2004 à 21:06:00   

Reply

Marsh Posté le 11-10-2004 à 21:13:07    

Juste une vérification cris, on est bien d'accord que

Code :
  1. char titi[] = "hello";
  2. char toto[] = "hello";


 
n'a pas le même comportement que:

Code :
  1. const char * titi = "hello";
  2. const char * toto = "hello";


 
ok ?
 
Dans son cas, comme il n'utilise pas une valeur immédiate, il effectue une recopie inutile (et potentiellement dangereuse, vu qu'il ne prend pas en compte la taille de la chaîne avant d'allouer sa destination).

Reply

Marsh Posté le 11-10-2004 à 21:15:51    

oui
 
char titi[] = "hello"; // voila un tableau qui contient
 
'h', 'e', 'l', 'l', 'o', '\0' donc sizeof titi == 6
 
 
const char * titi = "hello"; // voila un pointeur qui contient l'adresse de la chaine litterale "hello" qui est un tableau constant
 
j'y suis?

Reply

Marsh Posté le 11-10-2004 à 21:17:52    

Exactement. Et le point où je voulais en venir d'ailleurs, c'est que la plupart des compilos te permettent de n'allouer qu'une seule copie de "hello". Donc on aurait titi==toto dans cet exemple.

Reply

Marsh Posté le 11-10-2004 à 21:19:05    

y en a même qui font du partage de sous-chaine

Reply

Marsh Posté le 11-10-2004 à 21:20:23    

ok merci !
 
en fait je l'avais plus ou moins remarquer en regardant le code généré

Reply

Marsh Posté le 13-10-2004 à 13:37:55    

Taz a écrit :

par
 
#include <sstream>
 
istringstream is(nb);
nb >> f; // pareil qu'avec cin


 
c'est quoi f ?
 
et comment s'utlise istringstream ?
 


---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 13-10-2004 à 14:56:19    

MsHome a écrit :

c'est quoi f ?
 
et comment s'utlise istringstream ?


RTFM [:itm]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-10-2004 à 17:47:08    

les docs sont ecrites en etranger :o


---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 13-10-2004 à 17:48:54    

MsHome a écrit :

les docs sont ecrites en etranger :o

va te pendre, je te file un exemple et t'en as rien secouer ...

Reply

Marsh Posté le 13-10-2004 à 18:20:32    

MsHome a écrit :

les docs sont ecrites en etranger :o


Arrête l'informatique [:freekill]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 15-10-2004 à 19:34:52    

plz expliquez moi comment ca ca marche et je vous laisse tranquilles:
 
istringstream is(nb);
nb >> f;  
 
:jap: merci


Message édité par MsHome le 15-10-2004 à 19:35:04

---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 15-10-2004 à 21:19:44    

MsHome a écrit :

plz expliquez moi comment ca ca marche et je vous laisse tranquilles:
 
istringstream is(nb);
nb >> f;  
 
:jap: merci


Aaahhh, la magie de google
 [:atsuko]  
 
mais comme je suis sympa, je vais te donner le compte-rendu de la conversation entre moi et Taz sur les stringstreams
 

Citation :

Masklinn
Voila j'ai un hexa dans un string (oui, truc à la con), et je voudrais le convertir en quelque chose d'utilisable (genre un int)
 
j'ai trouvé StrToIntEx(LPCTSTR, STIF_SUPPORT_HEX, int *), mais... ma chaîne est en fait un basic_string<wchar_t>, donc au mieux je peux en extraire un wchar_t *... et j'arrive pas à trouver de fonction style StrToIntEx pour les wchar (les autres fonctions de conversion ne m'ont pas l'air de gérer les hexas, dis moi si je me trompe)
 
t'aurais pas une idée?
 
Edit, putain chuis trop con, je viens de voir que wcstol et wcstoul tu peux spécifier la base, j'avais pas remarqué avant [:totoz]


Citation :

Taz
 
non, j'ai pas windows.
utilise les wstringstream et on en parle plus


Citation :

Masklinn
 
oui mais ca m'aide pas à le convertir ca :)


Citation :

Taz
 
ben si ça t'aide si tu sais t'en servir


Citation :

Masklinn
 
la je dois t'avouer que j'ai beau regarder la doc des *stringstream je vois pas en quoi ca peut m'aider


Citation :

Taz
 
ben ça fait la meme chose que les *strto*


Citation :

Masklinn
 
la il va faloir m'expliquer (ou pas), parce que j'ai beau chercher je trouve pas comment on peut en sortir un int/long


Citation :

Taz
 
t'as déjà utiliser les stringstream ?


Citation :

Masklinn
 
ben non, sinon j'aurais su comment ils fonctionnaient et je n'aurais donc pas eu a te poser de question dessus :/


Citation :

Taz
 
bah documente toi, chez SGI par exemple ou cplusplus.com


Résultat?
je me suis mis dessus sérieusement, j'ai fini par comprendre comment ca marchait et maintenant je sais à peu près les utiliser.
Taz m'aurait donné la réponse, j'aurais fait mon truc et 2 jours plus tard je m'en serais plus souvenu [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 15-10-2004 à 21:24:44    

Comme on dit: si un homme a faim, apprend lui à pêcher au lieu de lui donner un poisson [:whatde]

Reply

Marsh Posté le 16-10-2004 à 09:44:16    

j'ai vraiement pas le temps  de passer ma vie a lire une doc que je ne comprends pas (mon niveau d'anglais est faible je suis que en 1ere) , je programme ce truc pour le plaisir et j'ai juste besoin de ce truc une seule fois dans mon prog.  
 
Si tu sais pourquoi ne pas me dire en une ligne comment on utilise stringstream pour convertir une chaine en float ?  
 
:sweat:


Message édité par MsHome le 16-10-2004 à 09:46:15

---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 16-10-2004 à 10:09:43    

Si t'as pas le temps maintenant, je me demande bien quand est-ce que tu l'auras. Si tu t'orientes vers la prog C++, les stringstream, tu les verras plus d'une fois dans ta vie. Ca vaut donc le coup de faire l'effort. (et accessoirement, savoir lire/parler l'anglais aussi) (et franchement, une intro en français, ça doit pouvoir se trouver)


Message édité par el muchacho le 16-10-2004 à 10:11:58
Reply

Marsh Posté le 16-10-2004 à 10:59:40    

bon la j'en suis a ca :
 

Code :
  1. #include <cmath>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <sstream>
  5. using namespace std;
  6. class calc
  7. {
  8. public:
  9. void newcalc(string nstr);
  10. float getresult();
  11. private:
  12. string::size_type lpos;
  13. float result;
  14. };
  15. void calc::newcalc(string nstr)
  16. {
  17. calc::result =0;
  18. float cumulr=0;
  19. string ustr=nstr;
  20. while(1)
  21. {
  22. //
  23. if(calc::lpos = ustr.find("+",0))
  24. {
  25. break;
  26. }
  27. //
  28. string::size_type ppos = ustr.find("+",0);
  29. calc::lpos = ppos;
  30. string nb = ustr.substr(ppos,1);
  31. ustr.erase(0,(ppos));
  32. stringstream nsstr;
  33. nsstr << nb;
  34. nsstr >> cumulr;
  35. calc::result = cumulr;
  36. }
  37. }
  38. float calc::getresult()
  39. {
  40. float tres = calc::result;
  41. return tres;
  42. }


 
 
ca compile sans erreurs mais getresult() retourne toujours 0 :sweat:


---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le 16-10-2004 à 12:07:13    

tu vas pas faire comme tout le monde et commencer par une classe Point :o

Reply

Marsh Posté le 16-10-2004 à 12:19:59    

tiens j'ai justement un exo à faire avec des opérations comme ca. du genre (3 4 +) :D

Reply

Marsh Posté le 16-10-2004 à 20:42:32    

moi c'est plutot un truc comme les caculettes style ti 82 >
 
1+2*3/2-4  mais bon je galere deja avec les + :/


---------------
http://sylvainm.chez.tiscali.fr mon site qu'il est bieng
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed