Float to string
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 55

Float to string



  1. #1
    kevin8z

    Float to string


    ------

    Bonjour, j'ai un problème, je veut faire la conversion d'un float vers une chaîne de caractères, seul problème le programme plante. Si j'enlève la ligne : "sprintf(buffer, "%12f", ww);" le programme fonctionne.
    Comment faire? même si je prend un exemple du compilateur mikroC ça ne fonctionne pas

    Merci
    Code:
    void INIT (){
    
    float ww = -1.2587538e+1;
    char  buffer[15];
    
    /*******************************************************************************
                             CONFIGURATION OSCILLATEUR
    *******************************************************************************/
    OSCCON = 0b01101110; //oscillateur interne 4MHz
    
    /*******************************************************************************
                             CONFIGURATION ENTREE/SORTIE
    *******************************************************************************/
    ADCON1 = 0b00001111; // configuration des port en entrée sortie numérique
    
    TRISA = 0;          // sortie
    TRISB = 0b00000011; // RB0-RB1 entrées
    TRISC = 0b00000001; // RC0 entrée
    
    LATA.RA5 = 1;
    LATC.RC2 = 1; // CS AD9833
    PORTA = 255;
    
    /*******************************************************************************
                             CONFIGURATION INTERRUPTION
    *******************************************************************************/
    IPEN_bit = 0;         // Pour la configuration de INTCON
    INTCON = 0b10010000;  // interruption sur RB0
    INTCON2 = 0b00110001; // sur front descendent
    
    /*******************************************************************************
                       CONFIGURATION SPI (CPOL = 1 & CPHA = 0)
    *******************************************************************************/
    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_HIGH_2_LOW);
    
    /*******************************************************************************
                         CONFIGURATION LCD & AFFICHAGE DEPART
    *******************************************************************************/
    Lcd_Init ();
    Lcd_Cmd (_LCD_CLEAR);
    
    Lcd_Out (1,10, "GBF");
    Lcd_Out (2,5, "0.1Hz - 2MHz");
    Lcd_Out (3,10, "BY");
    Lcd_Out (4,8, "KEVIN");
    
    sprintf(buffer, "%12f", ww);
     
     Lcd_Out (1,1, buffer);
     
    
    }

    -----
    Dernière modification par kevin8z ; 19/07/2013 à 20h04.

  2. #2
    paulfjujo

    Re : Float to string

    bonsoir,


    En C18 la fonction sprintf(buffer,valeur) ne marche pas pour le flottant.

    j'utilise donc cette fonction :

    à noter la taille du buffer ! 30 car


    Code:
     
     unsigned char *fltToa (float x, unsigned char *str,char precision)
    {
    /* converts a floating point number to an ascii string */
    /* x is stored into str, which should be at least 30 chars long */
    unsigned char *adpt;
    int ie, i, k, ndig;
    double y;
    adpt=str;
    ndig = ( precision<=0) ? 7 : (precision > 22 ? 23 : precision+1);
    ie = 0;
    /* if x negative, write minus and reverse */
    if ( x < 0)
      {
      *str++ = '-';
      x = -x;
      }
    /* put x in range 1 <= x < 10 */
    if (x > 0.0) while (x < 1.0)
      {
      x *= 10.0;		// a la place de =*
      ie--;
      }
    while (x >= 10.0)
      {
      x = x/10.0;
      ie++;
     }
    // in f format, number of digits is related to size 
     ndig += ie;				// a la place de =+
    //round. x is between 1 and 10 and ndig will be printed to
    // right of decimal point so rounding is ... 
    for (y = i = 1; i < ndig; i++)
      y = y/10.;
    x += y/2.;					
    if (x >= 10.0) {x = 1.0; ie++;} 
    if (ie<0)
      {
       *str++ = '0'; *str++ = '.';
       if (ndig < 0) ie = ie-ndig;
       for (i = -1; i > ie; i--)  *str++ = '0';
      }
    for (i=0; i < ndig; i++)
      {
      k = x;
      *str++ = k + '0';
      if (i ==  ie ) *str++ = '.';
      x -= (y=k);	
      x *= 10.0;	
      }
    *str = '\0';
    return (adpt);
    }

    (je ne sais pas si sprintf marche sous mikroC).
    Attention à limiter le string resultant à la largeur (nb de char) de ton LCD
    en mettant un 0 au bon endroit.
    Dernière modification par paulfjujo ; 19/07/2013 à 20h34.

  3. #3
    kevin8z

    Re : Float to string

    Merci mais justement mikroC donne un exemple de cette librairie je l'ai essayer et ça ne fonctionne pas, voici ce qui est donner:

    Code:
    double ww = -1.2587538e+1;
    char  buffer[15];
    
    void main(){
    
      UART1_Init(4800);                         // Initialize UART module at 4800 bps
      Delay_ms(10);
      
      UART1_Write_Text("Floating point number representation"); // Write message on UART
    
      sprintf(buffer, "%12e", ww);             // Format ww and store it to buffer
      UART1_Write_Text("rne format:");       // Write message on UART
      UART1_Write_Text(buffer);                // Write buffer on UART
    
      sprintf(buffer, "%12f", ww);             // Format ww and store it to buffer
      UART1_Write_Text("rnf format:");       // Write message on UART
      UART1_Write_Text(buffer);                // Write buffer on UART
      
      sprintf(buffer, "%12g", ww);             // Format ww and store it to buffer
      UART1_Write_Text("rng format:");       // Write message on UART
      UART1_Write_Text(buffer);                // Write buffer on UART
    }

  4. #4
    paulfjujo

    Re : Float to string

    OK.. pour mikroC avec sortie sur UART

    voir alors le detail de la fonction LCD_OUT
    car sous C18 il faut bien manager la provenance d'un string
    à savoir si il est logé en ROM ou en RAM
    à verifier

    Lcd_Out (1,10, "GBF"); <- constante , donc en ROM ?
    Lcd_Out (1,1, buffer); <- en RAM


    verifier aussi si il y a bien un zero en fin de buffer
    sinon le programme peut aller dans les choux..

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Re : Float to string

    je n'ai jamais utilisé de float dans mes tests avec mikroC vu que je n'ai que la version demo 2K
    et math utilise une grande partie...

    une autre piste:

    dans ton exemple mikroC
    ww est un double (64bits) ,
    pas un simple flottant (32 bits) comme dans ton programme LCD

  7. #6
    kevin8z

    Re : Float to string

    Le problème viens sur et certain de cette fonction sprintf, car quand j'utilise le mode debug il me renvoie une erreur, et quand j'enlève cette fonctionne sprintf ben la aucun problème le mode debug fonctionne. Je trouve ça étrange qu'il mette une librairie non fonctionnel.
    Si tu aurai un exemple pour utiliser ta fonction ce serait impec.
    Merci

  8. #7
    Jack
    Modérateur

    Re : Float to string

    sprintf est une fonction puissante mais assez complexe. Elle occupe donc beaucoup de place en mémoire. le problème vient sûrement probablement de là. Pour les mêmes raisons, il vaut mieux éviter les floats. Si tu travailles à 2 décimales de précision par exemple, au lieu de manipuler la valeur 3.55, travaille avec 355 qui est une valeur entière, il ne suffira plus que d'ajouter un point décimal au bon endroit dans la chaîne de caractère avant affichage.

    A+

  9. #8
    paulfjujo

    Re : Float to string

    extrait d'une appli en C18..

    la fonction flotToa est celle du post precedent

    static unsigned char Texte[128];
    float f1,f2;
    unsigned char *txt=&Texte[0];
    unsigned char CRam1[32];

    //f2= mesure sur entree ANA, avec mise à l'echelle
    //fltToa(f2,CRam1,2)); <- valeur flottante f2 , buffer=CRAM1, 2=precision au 1/100eme

    le resultat de flotToa est un pointeur sur CRAM1
    qui pourrait etre utilisé tel quel .


    j'envoi le resultat (txt) sur l'UART et sur le LCD nokia

    Code:
       ......
       OUT_RS232
       f2=(float)EAx*0.48828125;  // (500°C /1024 Points)
        k=sprintf(txt,"TInter: %s°C",fltToa(f2,CRam1,2));
        k=PutStr_RS(txt); Put_RS(';');
        OUT_LCD
       gotoxy(0,3);
        Nokia_PutRamString(txt);
        .....

  10. #9
    kevin8z

    Re : Float to string

    Du coup comment faire? car d'un coter sprintf prend beaucoup de place, je l'ai donc essayer avec une variable de type int mais résultat identique ça ne fonctionne pas. Donc je suis un peut bloquer

  11. #10
    Jack
    Modérateur

    Re : Float to string

    j'ai regardé vite fait mikroC. Il existe intToStr() pour la conversion apparemment.

    A+

  12. #11
    kevin8z

    Re : Float to string

    Merci, alors celui-ci fonctionne mais pas celui-la: FloatToStr();

  13. #12
    polo974

    Re : Float to string

    J'allais dire que la doc demandait un double, mais en fait, pour eux, un double, c'est la même chose qu'un float (4 octets) berk...

    Et pour ça, il faut douiller 249$... Ouch ! ! !
    Jusqu'ici tout va bien...

  14. #13
    paulfjujo

    Re : Float to string

    bonjour,

    au fait, utilises tu la version officielle (payante)
    ou la version demo limitee a 2k.?

    car avec la version demo ,des qu'on s'approche de la
    limite, il y a des effets de bords TRES BIZARRES !
    qui peuvent disparaitre qu'en limitant le code.

    J'ai vu aussi des problemes de chevauchement de pages,
    resolvables en deplacant l'ordre de configuration des tables...

    pour trouver le probleme,il faut peut etr aller fouiller
    dans le fichier map (result de compil).

  15. #14
    kevin8z

    Re : Float to string

    Je n'utilise pas vraiment une de ces 2 versions, ce qui ma donc fait refléchire hier que le problème était surement de la. Donc je pense donc utiliser le compilateur C18 mais le problème et que je ne trouve pas d'exemple pour utiliser un lcd en mode 4 bits.

  16. #15
    paulfjujo

    Re : Float to string

    type de LCD 2x16 ou 4x20 ou ?

    exemple pour un 2x16.
    Modifier la configuration en consequence pour adapter le port de control et le port de data
    (qui peuvent etre different !)

    LCD2x16_EDF.h.txt

    EDFinfo_LCD2x16.jpg
    Dernière modification par paulfjujo ; 20/07/2013 à 12h06.

  17. #16
    kevin8z

    Re : Float to string

    J'attend que les pièces jointes soit valider. Et j'utilise un LCD 4x20 en mode 4 bits sur le PORTB, sachant que je doit avoir au moins RB0 de disponible.

  18. #17
    Biname

    Re : Float to string

    Il faut un temps fou à 4 MHz pour transformer un float en une chaine.

    J'ai un code -16F628A 4MHz - qui incrémente un entier 32 bits et le print sur un LCD2x16, il lui faut 5 secondes pour compter jusque 300. Alors un float avec ses décimales et son exposant !! ... il lui faudra mille ans ... voire plus

    Vous ne vous rendez pas bien compte, il faudrait faire un peu d'assembleur.

  19. #18
    kevin8z

    Re : Float to string

    A oui c'est vraiment long, faut que je trouve un autre moyen pour transformer ce flottant en chaine

  20. #19
    kevin8z

    Angry Re : Float to string

    Avec C18 j'ai essayer ça, mais il me sort des erreur pour les #define exemple: previous definition of macro 'E_PIN' does not agree

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <p18F2520.h>
    #include <xlcd.h>
    #include <delays.h>
    
    #define DATA_PORT PORTB
    #define E_PIN PORTBbits.RB1
    #define RS_PIN PORTBbits.RB2
    #define RW_PIN PORTBbits.RB3
    
    #define TRIS_DATA_PORT DDRB
    #define TRIS_E DDRBbits.RB1
    #define TRIS_RS DDRBbits.RB2
    #define TRIS_RW DDRBbits.RB3
    
    void DelayFor18TCY( void )
    {
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    }
    void DelayPORXLCD( void )
    {
    Delay1KTCYx(60); //Delay of 15ms
    return;
    }
    void DelayXLCD( void )
    {
    Delay1KTCYx(20); //Delay of 5ms
    return;
    }
    
    void main() {
    
    /*******************************************************************************
                             CONFIGURATION OSCILLATEUR
    *******************************************************************************/
    OSCCON = 0b01101110; //oscillateur interne 4MHz
    
    /*******************************************************************************
                             CONFIGURATION ENTREE/SORTIE
    *******************************************************************************/
    ADCON1 = 0b00001111; // configuration des port en entrée sortie numérique
    
    TRISA = 0;          // sortie
    TRISB = 0b00000000; // RB0-RB1 entrées
    TRISC = 0b00000001; // RC0 entrée
    
    LATAbits.LATA5 = 1;
    LATCbits.LATC2 = 1; // CS AD9833
    PORTA = 255;
    
    // configure external LCD
    OpenXLCD( FOUR_BIT & LINES_5X7 );
    WriteDataXLCD(6); //write to LCD
    
    }

  21. #20
    kevin8z

    Re : Float to string

    avec mikroC si je fait:

    Code:
    float nbr = 1;
    char test [5] = "test";
    test [0]  = nbr + 48;
    Ca ne fonctionne pas. Par contre si je remplace le float par un int ou char ca fonctionne, je n'y comprend vraiment rien.

  22. #21
    Jack
    Modérateur

    Re : Float to string

    Citation Envoyé par kevin8z Voir le message
    avec mikroC si je fait:

    Code:
    float nbr = 1;
    char test [5] = "test";
    test [0]  = nbr + 48;
    Ca ne fonctionne pas. Par contre si je remplace le float par un int ou char ca fonctionne, je n'y comprend vraiment rien.
    a me semble toout à fait normal au contraire. Afin de ne pas perdre de précision, le compilateur va calculer l'expression de la somme d'un int et d'un float comme étant un float.
    Donc test[0] qui est un int ne peut pas être égal à un float.

    Si tu veux que la somme soit calculée avec des int, il faut "caster" la variable nbr:

    test [0] = (int)nbr + 48;

    Mais comme je l'ai dit précédemment, es-tu sûr d'avoir besoin de travailler avec de float?

    A+

  23. #22
    kevin8z

    Re : Float to string

    Merci je vais essayer ça. Oui je doit utiliser des float, car c'est pour faire un GBF et j'aurai une précision de 0.1Hz. J'ai penser aussi à utiliser des long (perte de virgule mais pas trop grave sur l'écriture du LCD je l'aurai remis à la bonne place) mais j'ai le même problème quand j'utilise LongWordToStr ();

  24. #23
    Jack
    Modérateur

    Re : Float to string

    Quelle est la valeur maxi avec laquelle tu veux travailler?

  25. #24
    kevin8z

    Re : Float to string

    Les valeurs seront de 0.1 jusque 2000000.0

  26. #25
    Jack
    Modérateur

    Re : Float to string

    essaie de voir la mémoire occupée lorsque ça fonctionne, puis lorsque ça ne fonctionne pas pour voir si tu ne dépasserais pas la limite

    A+

  27. #26
    kevin8z

    Re : Float to string

    Quand j'utilise pas de sprintf la mémoire ROM utiliser est de 9% et à peut près identique pour la RAM. Quand je l'utilise la mémoire occupé est respectivement 56% et 44%.

  28. #27
    kevin8z

    Re : Float to string

    j'ai essayer ça mais pareil ça ne fonctionne pas:

    float nbr = 123.1;
    nbr = nbr * 10;

    Et mon programme plante. Comment je peut faire? augmenter la fréquence du PIC?

  29. #28
    Jack
    Modérateur

    Re : Float to string

    Citation Envoyé par kevin8z Voir le message
    j'ai essayer ça mais pareil ça ne fonctionne pas:

    float nbr = 123.1;
    nbr = nbr * 10;

    Et mon programme plante. Comment je peut faire? augmenter la fréquence du PIC?
    Je ne vois pas ce qu'augmenter la fréquence pourrait changer.

    Comment se manifeste le plantage? Tu pourrais essayer de debugger en pas à pas pour voir quelle est l'instruction qui pose problème?

  30. #29
    kevin8z

    Re : Float to string

    Alors des qu'intervient un calcul avec un float ça beug. Comment je le voit, j'utilise un écran LCD et il ne fonctionne plus, j'essaye de mettre le mode debug il ne fonctionne pas non plus. Tout ça à cause d'un calcul avec un float.
    Donc si aucun float n'est utilisé, mon écran fonctionne normalement il m'affiche ce que je demande, et le debug fonctionne aussi.

  31. #30
    Jack
    Modérateur

    Re : Float to string

    ca bugge à partir de la 1ère instruction?

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Conversion de float sur STM32F4
    Par invite25df009a dans le forum Électronique
    Réponses: 0
    Dernier message: 15/02/2012, 10h38
  2. [C] - Conversion de Float en BCD - Possible ?
    Par invite3c35244f dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 22/12/2010, 09h15
  3. Float charge
    Par Ali Belal dans le forum Électronique
    Réponses: 4
    Dernier message: 23/02/2010, 08h59
  4. "String to float" dans un PIC : erreur
    Par hoffmann dans le forum Électronique
    Réponses: 6
    Dernier message: 15/11/2009, 12h07
  5. float
    Par invitedb0c35ce dans le forum Électronique
    Réponses: 3
    Dernier message: 24/02/2006, 19h46
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...