Conversión de int a cadena para AVR ATmega32

Estoy tratando de leer datos del ADC y mostrarlos en una pantalla LCD compatible con HD44870 con un ATmega32. Como los datos del ADC son un número entero sin signo de 10 bits, la pantalla LCD espera una cadena, por lo que es necesaria alguna conversión. A continuación se muestra la función que escribí para lograr esta conversión.

char *int_to_str(uint16_t num, uint8_t len){
    uint8_t i;
    char *str;
    str[len]='\0';
    for(i=(len-1); i>=0; i--){
        str[i] = '0' + num % 10;
        num/=10;
    }
    return str;
}

Sin embargo, la función anterior no funciona. Acabo de obtener una pantalla en blanco donde se deben mostrar los números. Actualmente estoy usando itoa() y funciona. Sin embargo, preferiría escribir el mío ya que el tamaño del ejecutable resultante es crítico. Gracias.

Consulta en sprintf(). Estás confundiendo la manipulación de enteros y cadenas.
sprintf probablemente usa itoa internamente y es probable que sea más grande.
¿Por qué crees que escribir tu propia implementación de itoa()será más pequeño?

Respuestas (2)

No hay ninguna razón por la que sprintf no funcione. Básicamente, esto imprime una cadena en un búfer en lugar de la salida estándar.

Como ejemplo

char string[256];
int value = 5;
memset(string,0,sizeof(string[0])*256); // Clear all to 0 so string properly represented
sprintf(string,"Value: %d",value);

cadena ahora contendrá la cadena "Valor: 5"

Su forma de manejar las cadenas es incorrecta. Acaba de crear un puntero de variable de pila a una cadena que no está inicializada y no apunta a una cadena con una longitud válida.

Declare str como str[len]e intente de esa manera.

Su primer párrafo es correcto y probablemente aborda correctamente el problema original. Pero "Declare str as str[len]and try that way" es un gran error cuando devuelve un puntero a esa variable (¡local!) más tarde, como pretende hacer el OP, vea return str;.