IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

bête conversion de string en double


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Par défaut bête conversion de string en double
    Bonjour,

    sous VC++ 2010 (MFC) mode debug 64 bits (win7), j'utilise une bête fonction atof() pour convertir un tableau de char ; lors de la première conversion je récupère bien le double correspondant mais lors des conversions suivantes j'ai 0.0000.. et non la valeur ; ma chaine se termine bien par le caractère nul et j'ai comme chaine un truc du genre "0.7932". (observé avec espion sur la variable...)
    Est ce lié à l'environnement 64 bits ou autres ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 492
    Par défaut
    Votre code svp.

  3. #3
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Par défaut
    voici le code (en gros) de la fonction appelé plusieurs fois dans l'exécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    double fct(...)
    {
    double d_resistance = 0.0 ;
    static char  buffer[60] = {'\0'} ;
    static char  buffdest[60] = {'\0'} ;
     
    //...........
     
     
    		if (....)
    		{
    			buffer[7] = 0 ;                         // ex : buffer est " 0.7210Ohm" 
    			memcpy(buffdest,buffer+1,7);
    			// 			i = 1 ;
    			if ( (buffer[1]) == '>')
    			{
    				d_resistance = 0.0 ;
    				......
    				return d_resistance ;
    			} 
    			else
    			{
     
    				.....
    // point d'arret >> buffdest est bien = "0.7210" dans notre exemple
                                    d_resistance = atof(buffdest);           // premier passage OK, second d_resistance = 0.00000000000
    				.....
    				m_st_recept_rs232 = strtmp ;
    			}
    		}
                    else
                    {
                           ....
                           return 0.0 ;
                   }
     
    return  d_resistance;
    }
    Merci

  4. #4
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Par défaut
    je viens de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			memset(buffdest,'\0',sizeof(buffdest));
    avant le memcpy :
    problème identique

  5. #5
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Par défaut
    Je viens d'essayer à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d_resistance = strtod(buffdest,&stopstr);
    problème identique !!!!

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 492
    Par défaut
    Code fragile, static plus multi-threading => nimprotenawak

    Code difficile à lire : indices, pointeurs, opération mémoire sur des char*, magique value '>' ...

    Concrètement, faites un code complet qui reproduit le problème.

  7. #7
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Par défaut
    dernier code essayé (car j'ai un peu tout essayé...)
    si vous arrivez à vous y retrouver :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    double CPosteCtrleBougiesGCSView::RS232LectureResistance(void)
    	{
    		static char  buffer[60] = {'\0'} ;
    // 		static char  buffdest[20] = {'\0'} ;
    		char *  buffdest ;
    		char * stopstr ;
    		static CString strtmp ;
    		double d_resistance = 0.0 ;
    		UINT i = 1 ;
     
     
    		if (RS232EnvoieRecept(charx04,buffer))         // reception de la chaine dans buffer
    		{
    			buffer[7] = 0 ;                                     // à partir du 7eme caractère : à éliminer
    			buffdest = buffer ;
    // 			memset(buffdest,'\0',sizeof(buffdest));
    // 			memcpy(buffdest,buffer+1,7);
     
    			if ( (buffer[1]) == '>')                             // car dans certain cas j'ai ">>>" comme chaine
    			{
    				d_resistance = 0.0 ;
    				strtmp = _T("Pas de résistance lue") ;
    				m_st_recept_rs232 = strtmp ;
    				m_st_recept_rs232.SetBkColor(ROUGEVIF);
    				return d_resistance ;
    			} 
    			else
    			{
     
    // 				d_resistance = 0.0f ;                                                          //*****************************************************************************
    //  				d_resistance = atof(buffdest);                                            // le problème de conversion se trouve ici en testant en debug la variable d_resistance / buffdest (buuffdest = bonne chaine
    				d_resistance = strtod(buffdest,&stopstr);                            // essayé avec des variables static ou non static...                      
    				m_st_recept_rs232 = strtmp ;                                           //*****************************************************************************
    			}
    		}
    		else
    		{
    			strtmp = _T("Erreur de lecture résistance") ;
    			m_st_recept_rs232 = strtmp ;
    			m_st_recept_rs232.SetBkColor(ROUGEVIF);
    			return 0.0f ;
    		}
     
    		RS232EnvoieRecept(charx00,buffdest);
     
    // 		strtmp.Format(_T("%s"),buffer+1);
    		m_st_recept_rs232 =  strtmp;
     
    		return d_resistance ;
    	}
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Conversion de String en Double
    Par JB-Tech dans le forum Windows Forms
    Réponses: 9
    Dernier message: 26/02/2018, 07h32
  2. Conversion de string en double
    Par etendard7 dans le forum C++
    Réponses: 4
    Dernier message: 05/04/2012, 17h45
  3. Réponses: 23
    Dernier message: 09/09/2010, 13h11
  4. conversion string en double
    Par kakrocq dans le forum C++/CLI
    Réponses: 4
    Dernier message: 11/04/2007, 13h54
  5. conversion string en double
    Par zmatz dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/10/2005, 22h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo