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

  1. #1
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    janvier 2005
    Messages
    550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : janvier 2005
    Messages : 550
    Points : 112
    Points
    112

    Par défaut [CVI] Double vers Char

    Bonjour,

    Je cherche à concaténer des chaines avec des valeurs numériques et des textes.

    Mes essais m'ont conduit ici :
    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
     
    int CVICALLBACK CB_Btn_Create_Led (int panel, int control, int event,
    								   void *callbackData, int eventData1, int eventData2)
    {
    	switch (event)
    	{
    		case EVENT_COMMIT:
     
    			/*	*************************************************************************
    				* Attention, ici on va stocker dans des variables le contenu des champs	*
    				* nécessaire à la sauvegarde des données								*
    				*************************************************************************	*/
     
     
     
    			char nameLed[256];		//Nom de la led
    			char colorLed[256];		//La couleur de la led
    			double I_directLed;		//L'intensité direct que peut supporter la led
    			double U_directLed; 	//La tension direct que peut supporter la led
    			char commentLed[256];	//Le commentaire sur la led
    			char chaineSaveLed[1000];//Chaine concaténé 
     
    			GetCtrlVal(panel, TABPANEL_1_ST_Name, nameLed);				//Panel > Tab Champ
    			GetCtrlVal(panel, TABPANEL_1_ST_Color, colorLed);			//Panel > Tab Champ
    			GetCtrlVal(panel, TABPANEL_1_I_Direct_Led, &I_directLed);	//Panel > Tab Champ
    			GetCtrlVal(panel, TABPANEL_1_U_Led_Direct, &U_directLed);	//Panel > Tab Champ
    			GetCtrlVal(panel, TABPANEL_1_TXT_Comment, commentLed);		//Panel > Tab Champ
     
    			//Créer la chaine à enregistrer au format CSV
    			//Concaténation de chaine
    			strcat (chaineSaveLed, nameLed);
    			strcat (chaineSaveLed, ",");
    			strcat (chaineSaveLed, colorLed);
    			strcat (chaineSaveLed, ",");
    			strcat (chaineSaveLed, I_directLed);
    			strcat (chaineSaveLed, ",");
    			strcat (chaineSaveLed, U_directLed);
    			strcat (chaineSaveLed, ",");
    			strcat (chaineSaveLed, commentLed);
    			strcat (chaineSaveLed, "/n");
     
     
    			printf ("%s\n", chaineSaveLed);
     
    			break;
    	}
    	return 0;
    }
    Le problème porte sur les valeurs double. On ne sait pas les concaténés. Existe-t-il une piste ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 795
    Points : 39 413
    Points
    39 413

    Par défaut

    sprintf() vers un buffer local, puis strcat?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    janvier 2005
    Messages
    550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : janvier 2005
    Messages : 550
    Points : 112
    Points
    112

    Par défaut

    Donc un truc du genre :

    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
     
    double I_directLed;		//L'intensité direct que peut supporter la led
     
    char buff_I_DirecLed[100];    //Buffer
    char chaineSaveLed[1000];//Chaine concaténé 
     
    GetCtrlVal(panel, TABPANEL_1_I_Direct_Led, &I_directLed);	//Panel > Tab Champ
     
    sprintf (buff_I_DirecLed, ?????? Format ??????, I_directLed); //Ici il manque le format car j'ai pas su comprendre ce que l'on attendait comme argument
     
    //A été réduit pour faire simple
    strcat (chaineSaveLed, ",");
    strcat (chaineSaveLed, buff_I_DirecLed); //Concaténation
    strcat (chaineSaveLed, ",");
     
    printf ("%s\n", chaineSaveLed);
    Comme on peut remarqué, j'ai u paramètre que je ne comprends pas. Mais avec quelques explications ça devrais être plus clair.

    Merci encore pour vos aides.

  4. #4
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 323
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 323
    Points : 3 885
    Points
    3 885

    Par défaut

    Le spécificateur de format pour le type double est lg ou lf (cf. documentation).

    On doit y ajouter un spécificateur de précision (ou utiliser snprintf) pour réaliser la conversion car la représentation décimale d'une valeur numérique de type double peut potentiellement nécessiter un très grand nombre de caractères (plusieurs centaines) et mener à un dépassement de capacité.

  5. #5
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    janvier 2005
    Messages
    550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : janvier 2005
    Messages : 550
    Points : 112
    Points
    112

    Par défaut

    Ah ok. Vue sous cet angle...

    Existe-t-il alors, une solution pour se passer du double tout en gardant la précision et la virgule ?

    Car dans ce cas, ce sera certainement plus propre que de risquer le dépassement de donné. En général, dans mes calculs je doit aller de l'Ampère au µA. Pour cette parti c'est en général des mA, mais j'ai rien contre aller un peu au delà.

    A titre d'exemple pour un champ en mA
    75.0 mA -> 0.075 A (sera rempli 75.0)
    200 µA -> 0.2 mA -> 0.0002 A (sera rempli 0.20)
    Je n'ai qu'à modifier le type dans le champ (quelques clics) et à changer mon double pour la nouvelle valeur.

    Merci en tout cas pour ces précisions.

  6. #6
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    janvier 2005
    Messages
    550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : janvier 2005
    Messages : 550
    Points : 112
    Points
    112

    Par défaut

    Hop, un retour au code.

    Bon, alors voila, au niveau des mA (milli Ampères), le plus sage est de revenir à des Ampères (A). Cela englobe toutes les leds que l'on trouve dans le commerce

    Du coup, un float devrais faire le travail prenant moins de place qu'un double et ayant une plus grande plage que le short.

    Si je résume, reprenez-moi si je me trompe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snprintf(float (champ de saisie) -> snprintf (target(char), 32, char[100]);
    J'ai mis 32 car la doc (voir en dessous) parle du size pour le float étant 32...

  7. #7
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    janvier 2005
    Messages
    550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : janvier 2005
    Messages : 550
    Points : 112
    Points
    112

    Par défaut

    En fait, ça ne fonctionne pas

    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
     
    char nameLed[256];		//Nom de la led
    char colorLed[256];		//La couleur de la led
    float I_directLed;		//L'intensité direct que peut supporter la led
    char I_directLed_C[100];
    float U_directLed; 	//La tension direct que peut supporter la led
    char U_directLed_C[100];
    char commentLed[256];	//Le commentaire sur la led
    char chaineSaveLed[1000];//Chaine concaténé
     
    GetCtrlVal(panel, TABPANEL_1_ST_Name, nameLed);				//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_ST_Color, colorLed);			//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_I_Direct_Led, &I_directLed);	//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_U_Led_Direct, &U_directLed);	//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_TXT_Comment, commentLed);		//Panel > Tab Champ
     
    //Conversion de type
    snprintf(I_directLed_C, 32, I_directLed);
    snprintf(U_directLed_C, 32, U_directLed);
    Ce que me répond la compilation :
    error: passing 'float' to parameter of incompatible type 'const char *'
    error: passing 'float' to parameter of incompatible type 'const char *'
    J'ai volontairement omis la concaténation pour me concentrer sur cette problématique de type.

    A noter, sauf si je me trompe, que j'ai un problème de pointeur et de constante. Mais je ne vois pas trop pourquoi ni comment

    Merci pour votre aide.

  8. #8
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    janvier 2005
    Messages
    550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : janvier 2005
    Messages : 550
    Points : 112
    Points
    112

    Par défaut

    Résolu

    En fait, j'avaispas compris un bon nombre de paramètre. Heureusement, persévérance du tchat et ici ont abouti au résultat que voila :
    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
     
    char nameLed[256];		//Nom de la led
    char colorLed[256];		//La couleur de la led
    float I_directLed;		//L'intensité direct que peut supporter la led
    char I_directLed_C[100];
    float U_directLed; 	//La tension direct que peut supporter la led
    char U_directLed_C[100];
    char commentLed[256];	//Le commentaire sur la led
    char chaineSaveLed[1000];//Chaine concaténé
     
    GetCtrlVal(panel, TABPANEL_1_ST_Name, nameLed);				//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_ST_Color, colorLed);			//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_I_Direct_Led, &I_directLed);	//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_U_Led_Direct, &U_directLed);	//Panel > Tab Champ
    GetCtrlVal(panel, TABPANEL_1_TXT_Comment, commentLed);		//Panel > Tab Champ
     
    //Conversion de type
    // size_t = 11 caractères (11+ \0 en caractère final)
    snprintf(I_directLed_C,20, "%f", I_directLed);	//De 0.000000 A à 999.999999 A
    snprintf(U_directLed_C,20, "%f", U_directLed);   //De 0.00 V à 999.99 V
     
    //Créer la chaine à enregistrer au format CSV
    //Concaténation de chaine
    strcat (chaineSaveLed, nameLed);
    strcat (chaineSaveLed, ",");
    strcat (chaineSaveLed, colorLed);
    strcat (chaineSaveLed, ",");
    strcat (chaineSaveLed, I_directLed_C);
    strcat (chaineSaveLed, ",");
    strcat (chaineSaveLed, U_directLed_C);
    strcat (chaineSaveLed, ",");
    strcat (chaineSaveLed, commentLed);
    strcat (chaineSaveLed, "/n");
     
    printf ("%s\n", chaineSaveLed);
     
    break;
    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/06/2009, 18h18
  2. Réponses: 2
    Dernier message: 24/03/2006, 10h46
  3. Pb de conversion: double[] vers un vector type???
    Par hycsos dans le forum SL & STL
    Réponses: 4
    Dernier message: 15/01/2006, 07h59
  4. LONG RAW vers CHAR
    Par morti dans le forum Oracle
    Réponses: 8
    Dernier message: 31/12/2005, 14h21
  5. [MFC] Problème de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    Réponses: 10
    Dernier message: 02/12/2005, 14h42

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