[C++] Conversion de CString en double

Conversion de CString en double [C++] - C++ - Programmation

Marsh Posté le 03-08-2004 à 10:07:16    

Voilà après un long moment de recherche sur le forum et via le net, je n'arrive pas à trouver une méthode qui pourrait me convertir un CString en double. Je suis en train de programmer un petit soft de calcul de propriétés de divers type de solution, donc j'ai agencé ça avec avec une fenêtre avec pleins d'edit box..
Mon problème, c'est que je dois récupérer des variables de types double or avec GetDlgItem(Text ou Int) ben je ne récupère pas le bon format.  
J'ai lu plusieurs topic sur la conversion vers des int mais chez moi, aucune ne marche.
En gros ce que je veux faire c'est OnKillFocusMonEditBox, récupérer la valeur de la edit box, sachant que j'y ai associé une variable de type double. Ça pourrait en quelque sorte éviter que je passe par le GetDlgItemTruc. Pui je voulais tenter un DDX_Text mais je sais pas comment faire juste pour une variable...
Bon voilà, je suis un peu (beaucoup) newb en programation alors j'en fais appel à vous :)
 
MERCI :jap:


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 10:07:16   

Reply

Marsh Posté le 03-08-2004 à 10:16:23    

Code :
  1. CString str = "123.456";
  2. double d = atof(str);


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 10:38:18    

J'ai vu ça sur les autres topic mais :) ça marche pas..  
Je peux pas parce que je veux récupérer une variable :)
 
En gros je fais :

Code :
  1. CString mavariable;
  2. GetDlgItemText(IDCmaEditBox,mavariable);
  3. double maautrevariable = atof(mavariable);


et ça marche pas...
et il me renvoie ça:

Code :
  1. 'atof' : cannot convert parameter 1 from 'class CString' to 'const char *'


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 10:42:14    

ah merde, j'ai oublié le cast !
essaie ça :

Code :
  1. double maautrevariable = atof(static_cast<LPCSTR>(mavariable));


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 10:46:03    

rattrape toi aux branches, je t'y prends à souiller mon static_cast avec ces windowseries [:taz]. il merdoie le forum, c'est gonflant

Reply

Marsh Posté le 03-08-2004 à 10:49:33    

J'allais grimpé au rideaux..... mais il me renvoie ça :
 

Code :
  1. 'static_cast' : cannot convert from 'class CString' to 'const char *'


 
Merci Harkonnen pour l'aide :)


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 10:51:30    

Taz a écrit :

rattrape toi aux branches, je t'y prends à souiller mon static_cast avec ces windowseries [:taz]. il merdoie le forum, c'est gonflant


tu peux pas imaginer comme la classe CString des MFC est mal fichue, t'es obligé d'utiliser ce genre de ficelle pour t'en sortir :'(


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 10:52:49    

Cpu Toaster a écrit :

J'allais grimpé au rideaux..... mais il me renvoie ça :
 

Code :
  1. 'static_cast' : cannot convert from 'class CString' to 'const char *'


 
Merci Harkonnen pour l'aide :)


t'utilises quelle version des MFC ? la 4.2 ou la 7 ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 10:54:16    

et pourquoi pas utiliser  

Code :
  1. CString chainalacon = "1234"
  2. double nombralacon = atof(chainalacon.c_str())


?


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

Marsh Posté le 03-08-2004 à 11:00:44    

Merci :) mais :( ça marche pas parce que C_str n'est pas membre de CString... d'après lui..
 
Harkonnen désolé, je vois pas où c'est la version du MFC :(
C'est visual 6.0 que messieurs du labo m'ont installé


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 11:00:44   

Reply

Marsh Posté le 03-08-2004 à 11:08:35    

tiens? me semblait qu'il existait aussi dans les CString... (vive les strings de la STL)
 
bon ben la MSDN dit:

Citation :

Converting to C-Style Null-Terminated Strings
 
Consider the following two cases:
 
    * In the simplest case, you can cast a CString object to be an LPCTSTR. The LPCTSTR type conversion operator returns a pointer to a read-only C-style null-terminated string from a CString object.
 
      The pointer returned by LPCTSTR points into the data area used by the CString. If the CString goes out of scope and is automatically deleted or something else changes the contents of the CString, the LPCTSTR pointer will no longer be valid. Treat the string to which the pointer points as temporary.
    * You can use CString functions, such as SetAt, to modify individual characters in the string object. However, if you need a copy of a CString object's characters that you can modify directly, use strcpy (or the Unicode/MBCS-portable _tcscpy) to copy the CString object into a separate buffer where the characters can be safely modified, as shown by the following example:
 
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
//... modify lpsz as much as you want
 
          Note   The second argument to strcpy (or the Unicode/MBCS-portable _tcscpy) is either a const wchar_t* (Unicode) or a const char* (ANSI). The example above passes a CString for this argument. The C++ compiler automatically applies the conversion function defined for the CString class that converts a CString to an LPCTSTR. The ability to define casting operations from one type to another is one of the most useful features of C++.


Message édité par masklinn le 03-08-2004 à 11:09:33

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

Marsh Posté le 03-08-2004 à 11:15:46    

Euh je comprends pas tout met, en gros en faisant :

Code :
  1. char unevariable[x]
  2. strcpy(unevariable,LPTSTR monCString)


 
Bon désolé j'écris n'importe quoi peut-être mais là, je suis un peu dépassé par les évènements...


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 11:22:33    

Cpu Toaster a écrit :

Euh je comprends pas tout met, en gros en faisant :

Code :
  1. char unevariable[x]
  2. strcpy(unevariable,LPTSTR monCString)


 
Bon désolé j'écris n'importe quoi peut-être mais là, je suis un peu dépassé par les évènements...


non, essaie plutot ça :

Code :
  1. double maautrevariable = atof(static_cast<LPCTSTR>(*mavariable));


Message édité par Harkonnen le 03-08-2004 à 11:22:51

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 11:25:41    

:(

Code :
  1. edit:
  2. 'static_cast' : cannot convert from 'const unsigned short' to 'const unsigned short *'


Bon, je vous prends la tête, je vais essayer de contourner via des boutons pour forcer le dodataexchange ce que je ne connais pas non plus .. :D Bon, c'est parti :)


Message édité par Cpu Toaster le 03-08-2004 à 11:27:17

---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 11:27:13    

unsigned short ?

Reply

Marsh Posté le 03-08-2004 à 11:28:15    

const unsigned short ?? CString en unicode ? il te faudrait une conversion unicode => ascii dans ce cas
et sinon, il me semble (je connais pas les MFC) qu'il ne faut pas mettre '*' ds l'exemple d'Harkonnen
 

Code :
  1. double maautrevariable = atof(static_cast<LPCTSTR>(mavariable));


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-08-2004 à 11:31:48    

Bon mon code :

Code :
  1. double p;
  2.         CString Temp_p;
  3. GetDlgItemText(IDC_EDIT_H2O_p,Temp_p);
  4. p= atof(static_cast<LPCTSTR>(Temp_p));


et ça me renvoie:

Code :
  1. 'atof' : cannot convert parameter 1 from 'const unsigned short *' to 'const char *'


Faut des librairies spéciales pour faire tout ça? (on sait jamais...)


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 11:35:05    

voila peut-etre un début de solution en utilisant la STL :
 

Code :
  1. #include <windows.h>
  2. #include <sstream>
  3. std::basic_istringstream<TCHAR> iss(static_cast<const TCHAR*>(tachaine));
  4. double d;
  5. if(iss >> d)
  6. {
  7.  // succes
  8. }
  9. else
  10. {
  11.  //erreur
  12. }


 
edit : +const


Message édité par blackgoddess le 03-08-2004 à 11:44:46

---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-08-2004 à 11:39:16    

Code :
  1. 'static_cast' : cannot convert from 'class CString' to 'unsigned short *'


quand je mets Temp_p à la place de tachaine.


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 11:41:56    

static_cast<const TCHAR*> pardon


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-08-2004 à 11:45:19    

ÇA COMPILE!!!! maintenant, faut que je comprenne la chose, pourquoi tu as mis

Code :
  1. if(condition)
  2. //succes  
  3. else
  4. //erreur


?
S'il y a succès normalement, ma variable p devrait prendre la valeur du CString c'est ça?
 
Merci à tous :jap:
je continue :)


Message édité par Cpu Toaster le 03-08-2004 à 11:46:01

---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 11:47:12    

non c'est l'inverse

Reply

Marsh Posté le 03-08-2004 à 11:47:49    

oui, mais s'il y a erreur, la variable est indéfinie ... donc ca peut etre une valeur valide ...
 
std::basic_istringstream<...>::operator >> retourne vrai si la conversion a réussi, faux sinon.
 
s'il y a succès, oui la variable prends la valeur du CString


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-08-2004 à 11:48:36    

pas retourne, 'est évalué à'

Reply

Marsh Posté le 03-08-2004 à 11:50:52    

oui, ca appelle l'operateur bool sur la référence std::basic_istringstream qui est 'la valeur' de retour de l'operateur ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-08-2004 à 11:58:46    

oki donc normalement je tape la suite du code dans succes alors et je laisse comme ça...
Je viens de me rendre compte que quand j'appuie sur mes boutons il se passe rien... pfff ça me soule, c'est la fin de la journée. Je m'en vais du bureau :(
Merci à tous :)


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 12:03:08    

T'es en Asie ? :)

Reply

Marsh Posté le 03-08-2004 à 12:09:58    

vi suis à Hong Kong :)
Rhooo, mon Onkillfocus, je met un AfxMessageBox derrière et il y a rien qui s'affiche :(


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 12:20:58    

Je me disais bien parcequ'en France c'est (malheureusement :ange:) pas trop l'heure de partir... :ange:
 
Par contre désolé j'y connais rien niveau MFC... :/

Reply

Marsh Posté le 03-08-2004 à 12:34:49    

et si t'essayais autre chose que atof ?
exemple :

Code :
  1. CString str = _T("1234.56787" );
  2. double x;
  3. _stscanf(str, _T("%lf" ), &x);


en plus, t'es blindé au niveau Unicode avec cette manip


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 12:47:59    

Bé non j'ai pas essayé, mais comme il compile je me prend plus la tête avec, je voulais vérifier si ça marchait en me balançant la valeur que je saisissai dans l'edit box, mais rien ne marche, je m'explique, j'ai ma dialog box, j'appuie sur tous les boutons et ou edit box que j'ai, il se passe rien :( alors que j'ai des onOK ou des trucs comme ça programmés et bien linker.. :(  
Bon je vais faire des heures sup à la maison moi...


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 12:49:54    

ben dans le OnOK(), balance un AfxMessageBox(), pour voir si c'est la pompe à messages ou ta fonction qui déconne [:sinclaire]


Message édité par Harkonnen le 03-08-2004 à 12:50:18

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 12:52:54    

Ben justement, il y a rien qui se passe, :(  
Pourtant j'ai bien créé tous mes trucs, j'ai même créé mon programme par dessus un sample du msdn... :(  
Grrr je vais metelefaire!


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le 03-08-2004 à 12:55:55    

est ce que ta fenêtre principale est bien rattachée à une classe :??:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-08-2004 à 13:04:45    

Ben oui, en gros ce que j'ai fait c'est que j'ai programmer par dessus le CmnCtrl2 des samples du msdn, en gros c'est une fenêtre d'application qui affiche une boîte de dialog avec plein de tab control. La fenêtre principal est lié a une CpropertySheet, et les tab affichent des "dialog" qui sont elles mêmes liées à des CPropertyPage.
Quand j'ai commencé à programmer, j'ai trouver où le programme indiquait quelles tab afficher et j'ai mis en comments les quelques lignes qu'il fallait dans le PropertySheet. Ensuite j'ai crée mes autres PropertyPage avec les dialog qui faut.  
Là je lance le programe, ben il m'affiche bien la boîte avec les tab et tous, je peux aller partout, par contre quand j'appuie sur les boutons avec du code derrière, même un bête AfxMessageBox(CString("truc" )); derrière... ça marche pas..
 
Par contre, je viens à me poser une question vu que sans le CString de mon Afxmessagebox, ça plante. Quand je compile, j'ai ce message:

Code :
  1. LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF

ça pourrait expliquer mes multiples erreurs précédentes?


---------------
Photo Toaster - Flickr Toaster - Blog Toaster
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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