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.
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.
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;
.
Jippie
sprintf()
. Sie verwechseln Integer- und String-Manipulation.user_1818839
Phil Frost
itoa()
kleiner sein wird?