Autor Tema: hitech : convertir formatos (de int a string, de float a string, etc...)  (Leído 7862 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
por recomendacion de angelgris, y no volver loco a nadie (y poner orden), abro este tema.

en el pretendo aprender lo que  es convertir los formatos de variables de un tipo a otro, como puede ser de int a string o de float a string.

en el post sobre la libreria del LCD, ya hablamos algo de int a string (que copiare aqui, para que quede constancia).

por otro lado pego el problema de pasar una variable float a string, pues no me funciona.





un saludo a tod@s.

 :-/


aqui mi pregunta:

hola:

yo sigo con lo mio angelgris, jeje, pasito a pasito.

he copiado tu ejemplo del ftoa y adapotado a mi programa.

me queda asi:

Código: [Seleccionar]
void SHOW_LCD(void)
{
char * SHOW_PRESS;
int * seba;
ClearLcd();
GotoxyLcd (1,1);
WriteStrLcd ("P= ");
//itoa(SHOW_PRESS,SENSOR_DATA,10);
SHOW_PRESS = ftoa (SENSOR_DATA, seba);
GotoxyLcd (4,1);
WriteStrLcd(SHOW_PRESS);
GotoxyLcd (1,2);
WriteStrLcd ("MODE: ");
GotoxyLcd (6,2);
WriteStrLcd (SHOW_MODE);
__delay_ms(200);

}


pero me da el siguiente error:

Error   [1098] C:\Archivos de programa\HI-TECH Software\PICC\9.80\sources\ftoa.c; 7. conflicting declarations for variable "_ftoa" (C:\pics\18_pruebas\pruebas.C:308)

y en la variables tengo asi:

Código: [Seleccionar]
float  SENSOR_DATA,POT_SER_DATA,POT_SEG_DATA,POT_MAX_DATA;
float SENSITIVITY = 0.009765625f;
char SHOW_PRESS[10];
char SHOW_MODE[10];



aparte que no entiendo muy bien el funcionamiento de ftoa, por el tema de los punteros.... (se agradece explicacion ;-))


saludos y mil gracias



y aqui la respuesta de angel gris:

  Hola nuevamente;

  Mirá esto: así está definida la última parte del archivo "stdlib.h" dentro de la carpeta "include"

Código: C
  1. extern char *   itoa(char * buf, int val, int base);
  2. extern char *   utoa(char * buf, unsigned val, int base);
  3. extern char *   ltoa(char * buf, long val, int base);
  4. extern char *   ultoa(char * buf, unsigned long val, int base);
  5. #ifdef  _PSOC_
  6. extern char *   ftoa(float f, int * status);
  7. #endif  // _PSOC_

y este es el archivo "ftoa.c" en la carpeta "sources"

Código: C
  1. #include        <stdlib.h>
  2. #include        <stdio.h>
  3.  
  4. // quick and dirty ftoa for legacy code
  5. char *
  6. ftoa(float f, int * status)
  7. {
  8.         static char             buf[17];
  9.         char *                  cp = buf;
  10.         unsigned long   l, rem;
  11.  
  12.         if(f < 0) {
  13.                 *cp++ = '-';
  14.                 f = -f;
  15.         }
  16.         l = (unsigned long)f;
  17.         f -= (float)l;
  18.         rem = (unsigned long)(f * 1e6);
  19.         sprintf(cp, "%lu.%6.6lu", l, rem);
  20.         return buf;
  21. }

  Volviendo al archivo "stdlib.h", no entiendo porque la definición de la función ftoa esta encerrada entre el "#ifdef _PSOC_"  :?
Pero si pongo la definición fuera de eso, el programa que haga uso de ftoa compila sin problemas.



BUENO ANGELGRIS, YO HE COMENTADO LOS IFDEF, PARA SACAR LA DEFINICION Y ME SIGUE DANDO EL MISMO PROBLEMA....

?? :(

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #1 en: 08 de Abril de 2011, 03:09:25 »
ok:

aparte de comentar el ifdef....

se me ha ocurrido el incluir en la carpeta de mi proyecto el archivo ftoa.c y en el programa incluir

#include "ftoa.c"

y ahora me compila bien.

ahora queda probar el funcionamiento


Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #2 en: 08 de Abril de 2011, 03:18:15 »
bravo:   :-/

funciona sin problemas.

es más, he vuelto a colocar en el archivo stdlib.h como estaba:

Código: [Seleccionar]
#ifdef _PSOC_
extern char * ftoa(float f, int * status);
#endif //_PSOC_ 




y simplemente he dejado la linea

#include "ftoa.c"


Tu, angelgris, me has dado la dirección, y yo he probado, pero no se muy bien la razon. Me imagino que en el archivo ftoa.c, de la carpeta sources (que yo he copiado a mi carpeta), tendrá alguna definición.

ahora solo nos da un mensaje de aviso de que la variable seba no se utiliza nunca.

¿la pregunta es que si tenemos que incluir el archivo *.C de cada funcion a usar??.


un saludo y seguiremos probando...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #3 en: 08 de Abril de 2011, 10:38:34 »
bravo:   :-/

funciona sin problemas.

es más, he vuelto a colocar en el archivo stdlib.h como estaba:

Código: [Seleccionar]
#ifdef _PSOC_
extern char * ftoa(float f, int * status);
#endif //_PSOC_ 




y simplemente he dejado la linea

#include "ftoa.c"


Tu, angelgris, me has dado la dirección, y yo he probado, pero no se muy bien la razon. Me imagino que en el archivo ftoa.c, de la carpeta sources (que yo he copiado a mi carpeta), tendrá alguna definición.

ahora solo nos da un mensaje de aviso de que la variable seba no se utiliza nunca.

¿la pregunta es que si tenemos que incluir el archivo *.C de cada funcion a usar??.


un saludo y seguiremos probando...

  Por lo que yo veo en la "stdlib.h", sólo pasa dicho problema con ftoa. Ya que es la única función que está dentro del "#ifdef _PSOC_". De hecho si probás con itoa vas a ver que no hay ningún error.

  Es lógico que al incluir el archivo "ftoa.c" te compile bien ya que en dicho archivo está la implementación de la función. Lo que no entiendo es porque no te compiló al editar el archivo "stdlib.h", yo ahora lo dejé así.... y funcionó bien la compilación

Código: C
  1. extern char *   itoa(char * buf, int val, int base);
  2. extern char *   utoa(char * buf, unsigned val, int base);
  3. extern char *   ltoa(char * buf, long val, int base);
  4. extern char *   ultoa(char * buf, unsigned long val, int base);
  5. extern char *   ftoa(float f, int * status);
  6. /*
  7. #ifdef  _PSOC_
  8. extern char *   ftoa(float f, int * status);
  9. #endif  // _PSOC_
  10. */

  Este es el programa que estoy compilando.......

Código: C
  1. #include <htc.h>
  2. #include <stdlib.h>
  3. #include "Def16f87xa.h"
  4.  
  5. #define PIC_CLK         10000000
  6. #define _XTAL_FREQ      10000000
  7. #include "delayhd.h"
  8.  
  9. #define LcdDataPort             PORTB
  10. #define LcdControlPort  PORTB
  11. #define LcdD4                   4
  12. #define LcdRSBit                0
  13. #define LcdENBit                1
  14. #define LcdRWBit                2
  15. #include "SuperLcd.c"
  16.  
  17. bit captura;
  18. unsigned int Periodo;
  19. unsigned int ValorCcp1;
  20. unsigned int ValorAnterior;
  21.  
  22. char texto[7];
  23. float Frecuencia;
  24.  
  25. void interrupt isr(void)
  26. {
  27.   static char veces;
  28.  
  29.   ValorCcp1 = get_ccpr1();
  30.   veces++;
  31.   if (veces == 2)
  32.   {
  33.     captura = 1;
  34.     veces = 0;
  35.   }
  36.   else
  37.     ValorAnterior = ValorCcp1;
  38.   CCP1IF = 0;
  39. }
  40.  
  41.  
  42. void main(void)
  43. {
  44.   char * texto;
  45.   int * seba;
  46.  
  47.   TRISA = 0;
  48.   TRISB = 0b00001000;
  49.   setup_comparator (NC_NC_NC_NC);
  50.   setup_timer1 (T1_INTERNAL | T1_DIV_1);
  51.   setup_ccp1 (CCP_CAPTURE_RE);
  52.   InitLcd();
  53.   enable_interrupt (INT_CCP1);
  54.   CCP1IF = 0;
  55.   enable_interrupt (GLOBAL);
  56.   while (1)
  57.   {
  58.     if (captura == 1)
  59.     {
  60.       disable_interrupt (INT_CCP1);
  61.       ClearLcd();
  62.       Periodo = ValorCcp1 - ValorAnterior;
  63.       GotoxyLcd (1,2);      
  64.       Frecuencia = (float) (2.5e6/Periodo);
  65.       texto = ftoa (Frecuencia, seba);
  66.       WriteStrLcd (texto);
  67.       WriteStrLcd (" Hz");
  68.       captura = 0;
  69.       CCP1IF = 0;
  70.       enable_interrupt (INT_CCP1);
  71.     }
  72.   }
  73. }

  Sólo tira el mensaje de warning con respecto a la variable seba que está siendo usada pero nunca toma un valor.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #4 en: 08 de Abril de 2011, 19:01:52 »
  Otra forma de poder trabajar con ftoa es poniendo "#define _PSOC_" antes de incluir el archivo "stdlib.h", quedando el código de la siguiente manera......

Código: C
  1. #include <htc.h>
  2.  
  3. #define _PSOC_
  4.  
  5. #include <stdlib.h>
  6. #include "Def16f87xa.h"
  7.  
  8. #define PIC_CLK         10000000
  9. #define _XTAL_FREQ      10000000
  10. #include "delayhd.h"
  11.  
  12. #define LcdDataPort             PORTB
  13. #define LcdControlPort  PORTB
  14. #define LcdD4                   4
  15. #define LcdRSBit                0
  16. #define LcdENBit                1
  17. #define LcdRWBit                2
  18. #include "SuperLcd.c"
  19.  
  20. bit captura;
  21. unsigned int Periodo;
  22. unsigned int ValorCcp1;
  23. unsigned int ValorAnterior;
  24.  
  25. char texto[7];
  26. float Frecuencia;
  27.  
  28. void interrupt isr(void)
  29. {
  30.   static char veces;
  31.  
  32.   ValorCcp1 = get_ccpr1();
  33.   veces++;
  34.   if (veces == 2)
  35.   {
  36.     captura = 1;
  37.     veces = 0;
  38.   }
  39.   else
  40.     ValorAnterior = ValorCcp1;
  41.   CCP1IF = 0;
  42. }
  43.  
  44.  
  45. void main(void)
  46. {
  47.   char * texto;
  48.   int * seba;
  49.  
  50.   TRISA = 0;
  51.   TRISB = 0b00001000;
  52.   setup_comparator (NC_NC_NC_NC);
  53.   setup_timer1 (T1_INTERNAL | T1_DIV_1);
  54.   setup_ccp1 (CCP_CAPTURE_RE);
  55.   InitLcd();
  56.   enable_interrupt (INT_CCP1);
  57.   CCP1IF = 0;
  58.   enable_interrupt (GLOBAL);
  59.   while (1)
  60.   {
  61.     if (captura == 1)
  62.     {
  63.       disable_interrupt (INT_CCP1);
  64.       ClearLcd();
  65.       Periodo = ValorCcp1 - ValorAnterior;
  66.       GotoxyLcd (1,2);      
  67.       Frecuencia = (float) (2.5e6/Periodo);
  68.       texto = ftoa (Frecuencia, seba);
  69.       WriteStrLcd (texto);
  70.       WriteStrLcd (" Hz");
  71.       captura = 0;
  72.       CCP1IF = 0;
  73.       enable_interrupt (INT_CCP1);
  74.     }
  75.   }
  76. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #5 en: 13 de Abril de 2011, 05:44:12 »
vale, como dije, ya me funciona, pero tengo una carencia que es que no entiendo bien lo de los punteros, o que funcion hace la variable seba.

por lo que veo tanto el texto como seba son punteros....

¿pero donde van o apuntan?, ¿gastan memoria?, etccc...

 :shock:

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #6 en: 13 de Abril de 2011, 08:55:31 »
  El puntero en sí no consume mucha memoria, no recuerdo bien si es que ocupa uno o dos bytes, ya que sólo tiene que almacenar una dirección de memoria.

  Yo no soy el más apto para explicarlo pero lo intentaré de todos modos....

  Supongamos que definís un array de 5 caracteres y lo llenás con la palabra "Hola", ese array ocupa 5 bytes. Ahora definís un puntero que apunta a ese array. Pero el puntero no ocupa 5 byte sino sólo 2 y en el puntero se almacena la dirección en la que comienza el array.

Código: C
  1. char saludo[5] = "Hola";
  2. char * puntero;
  3.  
  4. puntero = saludo;

  Suponiendo que la variable "saludo" empiece en la dirección 0x20. Luego de la línea "puntero = saludo" el dato almacenado en puntero será 0x20.
  Luego existe un operador para poder obtener el dato apuntado por dicho puntero.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #7 en: 13 de Abril de 2011, 11:03:33 »
te he entendido perfectamente.

ahora toca asentar conocimientos

 :-/

como siempre gracias

 :D


Desconectado Maxtronic

  • PIC10
  • *
  • Mensajes: 27
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #8 en: 13 de Abril de 2011, 15:01:58 »
Lo que no encontré es de string a float.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #9 en: 13 de Abril de 2011, 16:21:45 »
Lo que no encontré es de string a float.

  Se usa ATOI (AsciiToInteger) para convertir de texto a entero y ATOF (AsciiToFloat) para convertir de texto a real. En el manual del compilador hay unos ejemplo que muestran su utilización.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado sebastian 100

  • PIC12
  • **
  • Mensajes: 58
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #10 en: 17 de Abril de 2011, 01:12:13 »
hola !

vengo siguiendo este tema y la libreria para hi-tech, por cierto gracias!, funciona perfectamente

estuve tratando de sacasr por pantalla el valor de una variable float, y recien lo logré cuando puse esta linea, segun apuntaron acá:

 "#define _PSOC_"  , no tengo la menor idea de lo que hace, pero pude compilar el programa! :mrgreen: :mrgreen:

ahora las preguntas:
1. como hacen para darle un formato al numero, por ejemplo la cantidad de decimales a mostrar o aproximar el valor?
2. que significa el¨*, por ejemplo en esta linea "  char * texto; "??

gracias por todo, son de gran ayuda!

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #11 en: 17 de Abril de 2011, 09:17:59 »

hola:

el * es el que define que esa variable es un puntero, y angelgris, explica un poco mas arriba que hace...


lo de darle formato es interesante lo pensare, a ver si doy conello, antes que otros (lo mas seguro, jaja)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #12 en: 17 de Abril de 2011, 10:09:28 »
  Esta es la implementación de la función ftoa

Código: C
  1. char *
  2. ftoa(float f, int * status)
  3. {
  4.         static char             buf[17];
  5.         char *                  cp = buf;
  6.         unsigned long   l, rem;
  7.  
  8.         if(f < 0) {
  9.                 *cp++ = '-';
  10.                 f = -f;
  11.         }
  12.         l = (unsigned long)f;
  13.         f -= (float)l;
  14.         rem = (unsigned long)(f * 1e6);
  15.         sprintf(cp, "%lu.%6.6lu", l, rem);
  16.         return buf;
  17. }

  Come se ve, hace uso de la función sprintf para generar el string. Pero no convierte directamente el float, por algún motivo que todavía no entiendo primero convierte el float a dos variables long y luego con el sprintf convierte las variables long a string. ¿Tal vez sea porque consume menos recursos convertir long a string que convertir directamente el float a string?

  De todas maneras si no se quiere hacer uso de ftoa, se puede recurrir directamente a sprintf y buscando en la ayuda del compilador se encontrará como hacer para especificar la cantidad de decimales
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #13 en: 26 de Abril de 2011, 11:32:19 »
Estoy usando la función ftoa, de la siguiente manera:

Código: [Seleccionar]
char  * texto;
int status;

texto = ftoa(476.005, &status);
WriteStrLcd(texto);

Y me está mostrando lo siguiente: 476.0078

He probado con sprintf, y lo unico que consigo es que ocupe mucha memoria, con la misma representación.

¿Habeis experimentado algo así?

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: hitech : convertir formatos (de int a string, de float a string, etc...)
« Respuesta #14 en: 26 de Abril de 2011, 12:31:45 »
  Pues yo acabo de poner "NumeroEnTexto = ftoa (476.1, &Sebas);" y el número obtenido luego de la conversión es 476.101562.

Evidentemente algo pasa, digo yo haciendo uso de toda la inteligencia que tengo  :D
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas