Konvertieren von Int in String für AVR ATmega32

Ich versuche, Daten vom ADC zu lesen und auf einem HD44870-kompatiblen LCD mit einem ATmega32 anzuzeigen. Da die Daten vom ADC eine 10-Bit-Ganzzahl ohne Vorzeichen sind, das LCD einen String erwartet, ist eine Konvertierung erforderlich. Unten ist die Funktion, die ich geschrieben habe, um diese Konvertierung durchzuführen.

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;
}

Die obige Funktion funktioniert jedoch nicht. Ich bekomme nur eine leere Anzeige, wo die Zahlen angezeigt werden sollten. Ich verwende derzeit itoa() und es funktioniert. Ich würde es jedoch vorziehen, meine eigene zu schreiben, da die Größe der resultierenden ausführbaren Datei entscheidend ist. Danke schön.

Überprüfen Sie auf sprintf(). Sie verwechseln Integer- und String-Manipulation.
sprintf verwendet wahrscheinlich intern itoa und ist wahrscheinlich größer.
Warum glauben Sie, dass das Schreiben Ihrer eigenen Implementierung itoa()kleiner sein wird?

Antworten (2)

Es gibt keinen Grund, warum sprintf nicht funktionieren sollte. Dies druckt im Grunde eine Zeichenfolge in einen Puffer anstelle der Standardausgabe.

Als Beispiel

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);

string enthält nun die Zeichenfolge "Wert: 5"

Ihre Art, mit Strings umzugehen, ist falsch. Sie haben gerade einen Stack-Variablen-Zeiger auf einen String erstellt, der nicht initialisiert ist und nicht auf einen String mit gültiger Länge zeigt.

Deklarieren Sie str als str[len]und versuchen Sie es auf diese Weise.

Ihr erster Absatz ist korrekt und spricht wahrscheinlich das ursprüngliche Problem richtig an. Aber "Str als deklarieren str[len]und so versuchen" ist ein großes No-Go, wenn Sie später einen Zeiger auf diese (lokale!) Variable zurückgeben, wie es das OP beabsichtigt, siehe return str;.