Hallo, ich bin ganz neu in der Arduino Welt.
Ich brauche eine Funktion die ein int bekommt und ein char zurück gibt und sie soll noch eine 0 hinzufügen, also aus 1 wird 01 aus 5 wird 05
kein Array mit 2 Character definiert sondern eins mit 2 Pointern auf char (also sogar 8 Byte).
Wenn du es denn richtig gemacht hättest, also
char buf[2];
kriegst du spätestens mit dem
sprintf (buf, “%02i”, zahl);
Ärger weil das sprintf im “Gut” fall (zahl zwischen 0 und 99) die beiden Ziffern in buf kopiert und eine \0 anhängt für die aber kein Platz mehr ist (buf[2] !).
Also buf[3] wäre das mindeste !
So, zahl ist aber ein int, d.h. kann Werte zwischen -32768 und 32767 (auf dem Atmega)
annehmen. Das %02d hindert sprintf nicht daran größere Werte zu verarbeiten.
Also selbst bei buf[3] kracht es (oder es wird zumindes Speicher ungewollt überschrieben) wenn
zahl < 0 oder >99 ist.
Also entweder sicherstellen das zahl zwischen 0 und 99 ist oder char buffer[7]; deklarieren.
größte Darstellung wäre ja -32768 (6 Ziffern + \0 als Stringterminator)
Du musst dich erst mal mit den Grundlagen der Programmiererei und von Computern
beschäftigen. Das sind ja so viel Hämmer auf einmal drinn.
Also add
a)
die Methode twodig gibt einen char * zurück.
Schön und schlecht. Das Object auf das dieser char * zeigt ist buf das erstens in
einem Block local definiert ist und zweitens innerhalb einer Funktion (Methode).
D.h. das Object liegt temporär auf dem Stack des Prozessors und ist nur gültig so lange
die Methode twodig läuft. Was du zurück gibst zeigt ins Nirwarna und klappt manchmal
zufällig !
b)
In if 1 erzeugtst du einen String in dem du zahl auf das erste Byte des Strings
schreibst und dann eine null drannhängst.
Du musst unterscheiden zwischen der binären Darstellung in dem int und der Asciiausgabe im
Buffer. Steht in Zahl der Wert 1 dann schreibst du auf buffer 0 diese 1 und gibst das als String aus.
Das geht nicht. 1 ist kein druckbares Asciizeichen ! Klappen würde buf[0] = zahl + 0x30 (Ascii '0');
Das ginge aber nur von 0 - 9 (Wert für Zahl). Bei einem Wert von Zahl von 26 würdes du auf die
Art ein "A" ausgeben. Aber warum das Theater, sprintf macht doch alles für dich ?
Noch einmal die binäre Zahlwert in einem Int passt in 2 Byte. Für die Ausgabe brauchst du je nach
Vorzeichen und führenden Nullen zwischen 1 und 6 Byte.
Noch mal eine Verdeutlichung ist der Wert im int 12593 so steht in den beiden Bytes des Ints in
Hex 0x31,0x31 oder dez 49 und 49. Gibst du diese beiden Bytes direkt aus siehst du 11 aber nicht 12593.
Das mit %02i (besser %02d) hat schon gepasst. Das formatiert eine Zahl auf minimal Stellen mit führenden Nullen. Wieso machst du das jetzt per Hand? Das ist Blödsinn
Also den Puffer in der aufrufenden Funktion erstellen und als Parameter übergeben. Dann kann man den Zeiger wieder zurück geben, da er nicht auf lokalen Speicher zeigt. So funktionieren praktisch alle C String Funktionen dieser Art. Die Arduino String Klasse ist völlig überflüssig.
Der Sinn einer Funktion an der Stelle ist aber zweifelhaft.
beeblebrox:
In diesem Beispiel hast du denn String wieder lokal in der Funktion
Es geht. Es ist lediglich umständlicher Unsinn. String ist ein Objekt! Das kann man zurück geben. return buf1 erstellt automatisch ein String Objekt und kopiert das Array da rein. Der Compiler kann da sogar etwas Optimierung mit dem Speicher betreiben und einige Kopien unterdrücken, so dass es in der Praxis gar nicht mal so schlimm ist wie es auf den ersten Blick aussieht (die Kopie vom Array in das String Objekt findest natürlich trotzdem statt).
Der normale Weg ist eben den Puffer außerhalb zu erstellen und als Parameter zu übergeben. Dann kann man auch einen Zeiger zurück geben da er auf gültigen Speicher zeigt.
Serenifly:
Es geht. Es ist lediglich umständlicher Unsinn. String ist ein Objekt! Das kann man zurück geben. return buf1 erstellt automatisch ein String Objekt und kopiert das Array da rein. Der Compiler kann da sogar etwas Optimierung mit dem Speicher betreiben und einige Kopien unterdrücken, so dass es in der Praxis gar nicht mal so schlimm ist wie es auf den ersten Blick aussieht (die Kopie vom Array in das String Objekt findest natürlich trotzdem statt).
Der normale Weg ist eben den Puffer außerhalb zu erstellen und als Parameter zu übergeben. Dann kann man auch einen Zeiger zurück geben da er auf gültigen Speicher zeigt.
Oh Pardon !!! Ich habe übersehen das die Funktion vom Type String ist .
Ich dachte sie wäre char * gewesen. Dann hätte es höchstwahrscheinlich gerummst !