• Jueves 14 de Noviembre de 2024, 22:56

Autor Tema:  Convertir Cadena de caracteres en un float  (Leído 16590 veces)

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Convertir Cadena de caracteres en un float
« en: Sábado 28 de Marzo de 2009, 12:27 »
0
Hola a todos!

Necesito saber si hay alguna función o algo que me realice lo siguiente:

Estoy realizando un proyecto, y me encuentro con este problema: Tengo una cadena de caracteres declarada con "unsigned char cad[4], por ejemplo" y en cada una de esas 4 posiciones existirá un valor. Pues bien, necesito unir los 4 valores esos para formar una sola variable de tipo "float".
He estado mirando y existen funciones como atoi(convierte cadena Char en Int), atof(convierte cadena Char en double) y atol(convierte cadena Char en long), pero no he visto ninguna función que convierta Unsigned Char(que no Char solamente) a float.

Espero que me echéis una mano.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #1 en: Sábado 28 de Marzo de 2009, 13:06 »
0
Hace un casting y listo, los numeros solo pueden ser signed igual (48-57).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #2 en: Sábado 28 de Marzo de 2009, 13:11 »
0
Sé que haciendo un casting solamente puedo cambiar el tipo de una variable, pero es que necesito cambiar el de cuatro bytes de tipo unsigned char de una cadena, a una sola variable de tipo float. No quiero cambiar de tipo cada posición de la cadena unsigned char por otra posición de float.

Si tengo:

float var;
unsigned char cad[4];
cad[0]=23;
cad[1]=45;
cad[2]=128;
cad[3]=72;

quiero ponerlos unidos en una sola variable de tipo float, quedando por ejemplo: var=234512872 (este no es el resultado final, es solo para la explicación)

Saludos!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #3 en: Sábado 28 de Marzo de 2009, 13:24 »
0
Te decia que usaras atof con un casting a tu variable ... atof((const char*)cad);

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #4 en: Sábado 28 de Marzo de 2009, 13:30 »
0
Lo he intentado, pero el problema es que la función atof está hecha para usar cadenas de char, y no de unsigned char como yo necesito usar, así que me dice "invalid conservion from unsigned char to const char". ¿Hay alguna manera de hacer algo ahí?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #5 en: Sábado 28 de Marzo de 2009, 13:34 »
0
No se que estas tratando de hacer exactamente, usar unsigned char para una cadena no tiene mucho sentido pero con el casting si compila:

Código: Text
  1. unsigned char cad[] = "17.56";
  2. double x = atof((const char*)cad);
  3. printf("%frn", x);
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #6 en: Sábado 28 de Marzo de 2009, 13:41 »
0
Te pongo un ejemplo más parecido a lo que tengo:

   unsigned char cad[4];
   cad[0]=23;
   cad[1]=45;
   cad[2]=128;
   cad[3]=76;
   float c;
   char *p;
   double a;
   a=atof((const char*)cad);
   printf("%frn",a);

Y si hago esto, el resultado es 0.00000. Esto lo necesito porque tengo un GPS conectado al pc, y éste me está mandando información, y si no pongo unsigned char, hay valores que están negativos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #7 en: Sábado 28 de Marzo de 2009, 14:02 »
0
¿Es acaso una cadena eso? No me parece que lo sea eh ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #8 en: Sábado 28 de Marzo de 2009, 14:16 »
0
Si no es una cadena, ¿qué es?
Eso es lo que me devuelve el receptor de GPS, y es a lo que necesito hacerle la conversión para la que pido ayuda. SI elguien sabe hacer eso, que me eche una mano.

Saludos!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #9 en: Sábado 28 de Marzo de 2009, 14:50 »
0
Son un conjunto de bytes simplemente (por eso unsigned). Algo asi seria si fuera una cadena: ↨-ÇL, esta claro que no lo es, pero si no sabes vos que es ... dificil que sepamos los demas que no tenemos idea de que se trata tu problema.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #10 en: Sábado 28 de Marzo de 2009, 17:21 »
0
vos no tienes una cadena, tienes un arreglo de caracteres, distintos unos de otros.

acordate que las cadenas necesariamente terminan con '' , vos ni siquiera tienes eso.


fijate el ejemplo de Eternal Idol, esta bien hecho y funciona.

Código: C++
  1.  
  2. unsigned char cad[4];
  3. cad[0]=23;
  4. cad[1]=45;
  5. cad[2]=128;
  6. cad[3]=76;
  7. float c;
  8. char *p;
  9. double a;
  10. a=atof((const char*)cad); /*si cambiaras esta linea por:
  11.                                        a=atof((const char*)cad[0]);
  12.                                        veras algo diferente y te va a ayudar a comprender loque estamos                                                                     diciendo
  13.                                        */
  14. printf("%frn",a);
  15.  
  16.  
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Convertir Cadena de caracteres en un float
« Respuesta #11 en: Domingo 29 de Marzo de 2009, 12:37 »
0
zairillo, creo que tu problema radica en que no sabes cómo utilizar atof(). Esta función convierte una cadena de caracteres en un flotante, pero tal que

Código: C
  1. char *cadena = "123.45"
  2.  
se convierte en

Código: C
  1. float cadena_convertida = 123.45
  2.  
pero si nos fijamos en los valores REALES de char *cadena, verás que (puedes usar un depurador para comprobarlo):

Código: C
  1. cadena[0]=49
  2. cadena[1]=50
  3. cadena[2]=51
  4. cadena[3]=46
  5. cadena[4]=52
  6. cadena[5]=53
  7.  
es decir, son los códigos ASCII y no los números reales (el valor real en memoria) lo que convierte atof(). Evidentemente, si los códigos ASCII no son de números, te devolverá 0 (que es tu caso).

Además, como ya te dice Eternal Idol, unsigned char no tiene sentido, es lo mismo que char (lo puedes consultar donde quieras). Los caracteres no llevan signo, sino un código que los representa como puedes comprobar.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #12 en: Martes 31 de Marzo de 2009, 15:14 »
0
Muchas gracias por vuestra ayuda, me ha servido bastante.
Un saludo a todos!

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #13 en: Miércoles 1 de Abril de 2009, 19:25 »
0
Hola de nuevo!

Acabé entendiendo el ejemplo que me poniáis, lo hice en mi compilador y salió, pero a la hora de hacer lo mismo en mi proyecto me sigue devolviendo siempre 0.000000.
Me vuelvo a explicar por si hay algo que no dijese claro antes. Yo le mando una instrucción al GPS, el cuál me contesta con otra instrucción con un formato específico del protocolo que uso, y cada símbolo que me devuelve lo tengo almacenado en "unsigned char cad[100]". Entonces bien, yo para ver qué es lo que hay dentro hago un for(donde pongo un printf("%d",cad)), para sacar posición por posición lo que hay dentro de la cadena, por comprobarlo solamente, y me salen valores como 28, 64, 128, 154....Por lo que supongo que serán enteros asignados a los caractares ASCII de los símbolos que haya en cada posición de la cadena.
Entonces, cada 4 valores seguidos, en mi caso, me van a dar el nivel de cada satélite, por eso quiero unirlos y pasarlos a un float.
En la instrucción que me devuelve el GPS, según el protocolo los bytes(cada byte es una posición creo de la cadena) del 2 al 5 incluídos son el nvel del primer satélite(dice que el tipo de los bytes 2-5 es single(que equivale a un float)).

No sé si me he explicado un poco mejor, pero estoy desesperado porque no consigo convertirlo sin que me devuelva algo distinto a 0.000000.

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #14 en: Miércoles 1 de Abril de 2009, 19:57 »
0
Como te dije antes: ESO NO ES UNA CADENA. Son un conjunto de BYTES, olvida el termino cadena, se usa ese tipo de datos (unsigned char) para contener un BUFFER de lo que fuera.

Hace un casting a float si es verdaderamente un numero flotante de 4 bytes.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #15 en: Miércoles 1 de Abril de 2009, 20:08 »
0
He hecho el casting que me dices usando la función "atof", y el resultado es el que comento, sale 0.000000.
Como lo que me interesan son 4 posiciones del Buffer, extraigo esas 4 posiciones que me interesan en otro buffer, para que solamente esté eso, y ese segundo buffer lo mando a la función atof. Es decir, tengo:

unsigned char cad[500];
unsigned char nuevo[4];
double a;

en las posiciones 0,1,2,3, guardo los 4 posiciones de cad que me interesan y hago:
a=atof((const char*)nuevo);
printf("%frn",a);

y lo que sale es 0.00000.
también he probado a declarar nuevo de 5 posiciones, y poner en nuevo[5]='' y también poner nuevo[5]=0 y sigue saliendo lo mismo. ¿Algo mal? ¿Alguna idea más?

Siento las molestias, muchas gracias!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #16 en: Miércoles 1 de Abril de 2009, 20:10 »
0
No entendes, lo que tenes: NO ES UNA CADENA, atof transforma UNA CADENA a float. ESO QUE TENES NO ES UNA CADENA.

Si realmente es un float esto tendria que ser correcto:

Código: Text
  1. unsigned char cad[4];
  2. cad[0]=23;
  3. cad[1]=45;
  4. cad[2]=128;
  5. cad[3]=76;
  6.  
  7. float *t = (float*)&cad;
  8. printf("%f %d %xrn", *t, cad, cad);
  9.  

Su resultado tal vez sea logico o no: 67201208.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #17 en: Miércoles 1 de Abril de 2009, 20:16 »
0
Lo probaré lo que me dices, ya entendí que no es una cadena, pero según me dijeron si le ponía al final, sí que sería como una cadena.

Y a la hora de poner el printf, ¿Por qué sacas 3 variables?

printf("%f %d %xrn", *t, cad, cad).

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #18 en: Miércoles 1 de Abril de 2009, 20:19 »
0
No tiene ninguna utilidad terminar un conjunto de bytes que no son ASCII en cero, sigue sin ser una cadena.

Lo de las 3 variables es a gusto del consumidor, 3 representaciones de los mismos bytes.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #19 en: Miércoles 1 de Abril de 2009, 20:22 »
0
Eso del me lo habían dicho...no sabría tampoco mucho quien me lo dijo...jejeje
Muchas gracias Eternal Idol. Mañana lo probaré y te diré resultados.

Saludos!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #20 en: Miércoles 1 de Abril de 2009, 20:25 »
0
Lo del 0 terminador es un requisito de una cadena como tal pero no tiene sentido sino tenes caracteres antes del mismo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #21 en: Jueves 2 de Abril de 2009, 12:16 »
0
He estado probando lo que me dijiste. Ya creo que sé en qué radica el problema.
Los valores que me devuelve el GPS están en hexadecimal, de ahí que a la hora de convertir a float los valores, lo que me salga no tenga mucho sentido... ¿La forma de la conversión sería la misma? ¿O tendría que cambiar algo por ser valores en hexadecimal?
Es que por ejemplo, pido la hora actual, la cuál me la devuleve en segundos, y sale una cosa así:

cad[0]=0x48;
cad[1]=0xBA;
cad[2]=0x37;
cad[3]=0x5F;

y al hacer el casting como me dijiste, me saldría lo siguiente en un float: 13238973219446194000.000000, lo cuál es una barbaridad de segundos, así que hay algo que no está bien a la hora de hacer la conversión, ya que tengo un programa para el GPS, en el que también puedo ver que esos valores en hexadecimal recibidos son los correctos.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Convertir Cadena de caracteres en un float
« Respuesta #22 en: Jueves 2 de Abril de 2009, 12:21 »
0
Cita de: "zairillo"
Los valores que me devuelve el GPS están en hexadecimal, de ahí que a la hora de convertir a float los valores, lo que me salga no tenga mucho sentido...
Pues claro, y en binario, y en decimal, y en octal, y en sexagesimal... Eso es sólo una representación, el valor en sí es el mismo. ¿O acaso no es lo mismo 16:30, 4:30 y las cuatro y media de la tarde, pero se escriben de diferente manera?  :bad:

¿Cuántas veces te vamos a tener que repetir lo mismo?  :ph34r:

zairillo

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Convertir Cadena de caracteres en un float
« Respuesta #23 en: Jueves 2 de Abril de 2009, 13:25 »
0
Todos no podemos saber tanto...Si todos fuéramos tan listos...qué sería...Pensé que en los foros se intentaba ayudar, como hace Eternal Idol, no chulear como haces tú, porque las cosas se pueden decir de otra forma...En fin...
He preguntado si sería igual, porque el resultado es algo imposible, ya que, el resultado es en segundo, y si eso lo pasaba a años serían 419805086867 años...Pero ya he estado investigando y con una función de la librería time.h me lo da exacto.
Muchas gracias por la ayuda de estos días, y perdón por las molestias!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Convertir Cadena de caracteres en un float
« Respuesta #24 en: Jueves 2 de Abril de 2009, 13:47 »
0
Cita de: "zairillo"
porque las cosas se pueden decir de otra forma
Bueno, la verdad me equivoqué con otro post y te pido disculpas.

Me alegro que hayas conseguido algo  :good:  :hola: