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

C Discussion :

[EFL] - Probléme fonction conversion string en double


Sujet :

C

  1. #1
    Membre régulier Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 71
    Points
    71
    Par défaut [EFL] - Probléme fonction conversion string en double
    Bonjour,
    J'essai d'écrire un programme qui utilise la librairies Enlightenment Foundation Libraries (EFL)
    Donc dans mon cas j'utilise la librairie EINA
    et plus particulierrement une fonction de convertion des string en double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EAPI Eina_Bool 	eina_convert_atod  (const char *src, int length, long long *m, long *e)
     	Convert a string to a double.

    dont voici un exemple d'utilisation :
    Issue de la doc offiiel :

    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
     #include <stdlib.h>
     #include <stdio.h>
     
     #include <Eina.h>
     
     int main(void)
     {
        char      tmp[128];
        long long int m = 0;
        long int  e = 0;
        double    r;
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
        eina_convert_dtoa(40.56, tmp);
        printf("value: %s\n", tmp);
     
        eina_convert_atod(tmp, 128, &m, &e);
        r = ldexp((double)m, e);
        printf("value: %s\n", tmp);
     
        eina_shutdown();
     
        return EXIT_SUCCESS;
     }

    et donc voici mon code ou j'utilise cett fonction, en fais je me suis fait une focnction qui me retourne directement un double :
    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
    52
    53
    #include <stdlib.h>
     #include <stdio.h>
    #include <math.h>
     #include <Eina.h>
     
     
     
    double convert_string_double (const char *tmp)
    {
     
        long long int m = 0;
        long int  e = 0;
        double    r;
        //int taille_string = strlen(tmp);
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
          printf("value string : %s\n", tmp);
     
    	//convert string to double
        if (eina_convert_atod(tmp, 128, &m, &e))
    		    printf("Convertion Sucess \n");
    	else
    			printf("Convertion Ratée \n");
        r = ldexp((double)m, e);
        printf("value double: %f\n", r);
     
        eina_shutdown();
     
    return r;
     
    	}
     
     
     
     
     int main(void)
     {
     
    double r = 0; 
    const char *tmp = "43.5";
     
     
    r = convert_string_double (tmp);
     
    printf("value double = %f\n",r);
     
    return 0;
     }
    et le résultat est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    value string : 43.5
    Convertion Ratée 
    value double: 0.000000
    value double = 0.000000
    Donc la convertion est ratée mais jene sais pas pourquoi, je pense peut étre à un probléme de passage entre le char et le char*, qu'en pensez vous svp ?

  2. #2
    Membre régulier Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 71
    Points
    71
    Par défaut
    en lisant mieux la doc il apparait qu'il faut que mon stricg char soit au format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    This function converts the 32.32 fixed point number fp to a string. The string is stored in the buffer pointed by des  and must be sufficiently large to contain the converted fixed point number. The returned string is terminated and has the following format:
     
     [-]0xh.hhhhhp[+-]e

    mais je comprend pas l'écriture "[-]0xh.hhhhhp[+-]e" si quelqu'un peut me guider svp?


    merci d'avance

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Peut être que c'est tout simplement la fausse taille que tu fournis ? :
    Code Mika2008 : Sélectionner tout - Visualiser dans une fenêtre à part
    if (eina_convert_atod(tmp, 128, &m, &e))
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  4. #4
    Membre régulier Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Points : 71
    Points
    71
    Par défaut
    ça change rien pour la taille, mais par contre dans la doc il dise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    This function converts the string s of length length  that represent a double in hexadecimal base to a double. It is used to replace the use of snprintf() with the %a modifier, which is missing on some platform (like Windows (tm) or OpenBSD).
     
    The string must have the following format:
     
     [-]0xh.hhhhhp[+-]e
     
    where the h are the hexadecimal cyphers of the mantiss and e the exponent (a decimal number). If n is the number of cypers after the point, the returned mantiss and exponents are:
     
     mantiss  : [-]hhhhhh
     exponent : 2^([+-]e - 4 * n)
     
    The mantiss and exponent are stored in the buffers pointed respectively by m and e.
    c'est ça en fait que je comprend pas cette histoire de mantiss et d'exponent



    car voila le dernier code,et je ne vois pas pourquoi il ne convertit pas mon string en double :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     #include <stdlib.h>
     #include <stdio.h>
     #include <math.h>
     
     #include <Eina.h>
    double convert_string_double (const char *tmp)
    {
     
        long long int m = 0;
        long int  e = 0;
        double    r;
        //int taille_string = strlen(tmp);
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
          printf("value string : %s\n", tmp);
     
    	//convert string to double
        if (eina_convert_atod(tmp, 128, &m, &e))
    		    printf("Convertion Sucess \n");
    	else
    			printf("Convertion Ratée \n");
        r = ldexp((double)m, e);
        //printf("value double: %f\n", r);
     
        eina_shutdown();
     
    return r;
     
    	}
     
     
     
     
     
     int main(void)
     {
     
     
     
     
     
        //const char     tmp[128]= "6.8";
        const char     tmp[128]= "0x2.453cd3+2";
     
        double    r;
     
         //snprintf(tmp, sizeof(tmp),"%a",tmp);
     
     
        if (!eina_init())
        {
            printf ("Error during the initialization of eina.\n");
            return EXIT_FAILURE;
        }
     
     
     
     
     
    r = convert_string_double (tmp);
     
    printf("value double = %f\n",r);
     
        eina_shutdown();
     
        return EXIT_SUCCESS;
     }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'ai pas tout lu en détail, mais dans l'exemple tmp est dimensionné à 128 caractères, dans votre essai à 4 caractères.
    Si vous passez un paramètre en const, il ne sera pas modifié.
    Je regarderai ça mieux demain.
    Bonsoir.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bon,
    Le fonction ...atod converti une chaine en double.
    La place à réserver pour la chaine est au maximum de 128 caractères, y compris le 0 terminal.
    Les valeurs acceptées doivent être de la forme
    [-]0xh.hhhhhp[+-]e
    c'est à dire
    1- un signe moins optionnel
    2- des chiffres hexa avant le point décimal
    3- un point décimal
    4- 5 chiffres hexa après le point décimal
    5- moi, j'aurais écrit e[+-]p, mais leur écriture est conventionnelle (e == 14)

    La particularité est que la valeur attendue est de l'hexadécimal.
    C'est à dire que si tmp contient A.0 le double renvoyé est 10.00000.
    Si vous voulez transformer une valeur caractère représentant un double (par exemple 1256.25, pour un montant en €, en base décimale), il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *tmp[16];
    strcpy(tmp,"1256.25");
    double Val;
    sscanf(tmp,"%0.2lf",&Val);  // entre le 2 et le f, c'est la lettre L minuscule
    Sauf si j'ai rien compris, mais il suffit de faire des essais.

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    * La chaine doit être composée
    - d'un signe - optionnel suivi de 0x
    - d'un chiffre hexa représentant la partie entière
    - d'un point introduisant la partie fractionnaire constituée de n chiffres hexa
    - le caractère p introduisant l'exposant écrit en décimal avec un signe optionnel

    Exemple : "3.a12p4" représente la valeur :
    (3+10/16+1/16/16+2/16/16/16)2^4 = 3*16+10+1/16+2/256 = 58.0703

    ** Pour la question sur la mantisse et l'exposant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [+-]0xh0.h1h2...hnp[+-]e représente la valeur V suivante (en posant B = 2^4) 
    
    V = [+-]( h0B^0+h1B^(-1)+ h2B^(-2)+...+hnB^(-n) )2^[+-]e
    
      = [+-]( h0B^n+h1B^(n-1)+ h2B^(n-2)+...+hnB^0 )2^[+-]e * B^(-n)
    
      = [+-]( h0B^n+h1B^(n-1)+ h2B^(n-2)+...+hnB^0)2^([+-]e-4n)
    
    M = [+-]h0B^n+h1B^(n-1)+ h2B^(n-2)+...+hnB^0 est un entier long long renvoyé comme mantisse
    E = [+-]e-4n est un entier long renvoyé comme exposant.
    
    La valeur du nombre est alors V = M*2^E
    En suivant l'exemple précédent :
    M = 3a12 (=14866)
    E = 4-3*4 = -8
    et
    V = 14866*2^(-8) =58.0703
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Problème de conversion String en Double
    Par eighty_three dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2008, 10h41
  2. Problème de conversion String en Float avec JTable
    Par dumasan dans le forum Composants
    Réponses: 4
    Dernier message: 23/04/2007, 12h56
  3. conversion string en double
    Par kakrocq dans le forum C++/CLI
    Réponses: 4
    Dernier message: 11/04/2007, 14h54
  4. Problème de conversion string->int
    Par seheiahs dans le forum Langage
    Réponses: 4
    Dernier message: 28/06/2006, 11h42
  5. conversion string en double
    Par zmatz dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/10/2005, 23h46

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