Hallo,
mal eine kurze Frage in die Runde. Gibt es irgendwo eine Code-Sammlung,
wo man alternative Funktionen findet, die deutlich weniger Flash/RAM
brauchen?
Ich habe zum Beispiel hier das Problem, dass diese doch recht kurze
Funktion einen riesigen Speicherzuwachs verursacht.
1
constchardelimiter[]=",;:";// Trennzeichen
2
constunsignedcharSIZE_OF_DATA=5;// Maximal zu empfangende Datenfelder
Ich empfange auf einem Attiny einen String, der immer wie folgt aussieht
char buffer[] = "01:02:0f:0F:FF\n";
Nun habe ich das in meiner Anweisung bislang so gemacht,
das ich jedes Mal eine Zeichenkette bis zum Auftreten des Trennzeichens
einlese. Die Zeichenkette (in meinem Fall im 2 Zeichen lang + '\0') wird
dann mit strtol in eine Zahl umgewandelt zur Basis 16. Anschließend
landet diese in einem Zahlenarray. Sollten einmal, wieso auch immer mehr
Datenfelder eingelesen werden, so werden die weiteren ignoriert.
Kennt jemand dazu eine smarte Alternative?
Hallo Dirk,
danke schon einmal für den Tipp. So funktionierte es nicht direkt. Gab
aber keine Compilerwarnung, werde es gleich noch einmal weiter testen.
Es würde auf jedenfall schon mal ein kleines bisschen am Speicher
sparen.
Würde aber gerne komplett auf string.h und stdlib.h verzichten können.
Das ist die einzige Stelle im ganzen Programm, wo ich das benötige.
Output:
01:02:0f:0F:FF
01:01:00:00:00
Manchmal ändert sich die 2. Zeile auch.
Fazit: Das Programm tut überhaupt nicht, was es soll. Wurde das
überhaupt mal getestet?
Alternative ohne die Kanonen auf Spatzen (strtok & strtol) folgt
gleich...
Output:
01:02:0f:0F:FF
01:02:0f:0f:ff
Passt also.
Voraussetzung ist aber, dass der TO das Format von Buffer
("xx:xx:xx:xx:xx\n") vorher prüft. Sonst geht das hier in die Hose.
DirkB schrieb:> @Frank M.>> In deinem ersten Beispiel fehlt der initiale Aufruf von strtok (da ist> der erste Paramter != NULL)
Stimmt, Du hast recht, den habe ich versehentlich gelöscht.
Nichtsdestotrotz: Meine gepostete Alternative ist kürzer und schneller
:-)
Hallo Frank,
klasse Ansatz. Hab mir deine Idee auch erst einmal direkt abgespeichert.
Habe es bei mir ähnlich gelöst mit string und stdlib, da es mir so im
Buch auch nicht anders erklärt wurde. Leider findet meisten keine
Alternativen und muss die selber schreiben.
Ich werde deine Idee mal versuchen aufzuarbeiten. Habe auch immer einen
String, den ich splitten muss. Bekomme aber ab und zu ein paar falsche
Werte rein. Mal schaun ob ich das evtl. etwas passend umschreiben kann
;)
Werd dann meinen Ansatz hier auch noch mit reinstellen.