[SOLUCIONADO] ¿sprintf no funciona con float?

Hola a todos. En una de tantas pruebas, me encontré con la siguiente sorpresa:

Probando algo como:

char s[20];
const float pi = PI;

void setup() {
  Serial.begin(9600);
  sprintf(s, "El valor de pi es: %.4f", pi);
  Serial.println(s);
}

void loop() {}

Me da la siguiente salida:

El valor de pi es: ?

Traté con todos los especificadores que lleven a imprimir números con decimales, y sigue siendo lo mismo. Los que imprimen números enteros, hexadecimales, caracteres y cadenas de caracteres, funcionan de lo más bien; solo los de números con decimales me hacen eso.

No pido soluciones alternativas obvias como crear instancias de String con el valor de la variable, o imprimir todo en dos llamadas a print; sino que alguien me pueda explicar por qué pasa esto.

Se lo agradecería y bastante :slight_smile:

Hola.

Prueba esto:

char s[20];
const float pi = PI;

void setup() {
  Serial.begin(9600);
  sprintf(s, "El valor de pi es: %6.4f", pi);
  Serial.println(s);
}

void loop() {}

Saludos.

Y de todas formas... lo mismo; solo que ahora le agrega 6 espacios antes del '?'

El valor de pi es:      ?

Perdón por el resbalon. No lo habia compilado y he creido que seguia el estandar.

Abusando de tu paciencia prueba esto:

char s[20];
float pi=PI;

void setup()
{
  Serial.begin(9600);
  Serial.print("El valor de pi es: ");
  Serial.println(dtostrf(pi, 6, 4, s));
}

Nada que decir en mi descargo, tan solo que, al parecer, la sprintf() implementada efectivamente no trabaja con float en Arduino.

Espero que esto te sirva.

Saludos

Ahora sí. Esto debería servir para los que quieran hacer un datalogger rápido, sin usar print.

Alfaville:
Nada que decir en mi descargo, tan solo que, al parecer, la sprintf() implementada efectivamente no trabaja con float en Arduino.

Cuando me puse a buscar sobre dtostrf para estar seguro sobre los parámetros y el retorno (por cierto la IDE de Arduino no me coloreo esa palabra), encontré una página que al principio dice exactamente lo mismo; así que quedé convencido de que no es el mismo del estándar C++.

Y la solución no es tan obvia, entonces la acepto :smiley:

Sin más que decir, daré por concluido este hilo. ¡Muchas gracias Alfaville por tus respuestas! :wink:

Me cito a mi mismo:

Hola Lucario.
Si quieres que la funcion "dtostrf" ( o cualquier otra), te aparezca coloreada en el editor del IDE, puedes hacerlo incluyendola en el archivo "keywords.txt" (en el correspondiente apartado), que se encuentra en el path. "ArduinoXXX\lib\keywords.txt", suponiendo que tu instalacion se haya colocado de un modo estandar.
Espero te ayude.
Saludos.

Si señor esta es la solución.

Yo hace unos meses atras tenia este problema. Lo escribí en este enlace en el segundo mensaje.

Me costo lo mio solucionarlo. Saludos :slight_smile: