Hallo zusammen
Im Zusammenhang eines Projekts ist eine C-Bibliothek entstanden, welche
Integer in Strings umwandelt. Unterstützt werden dabei die Datentypen
aus stdint.h: (u)int8/16/24/32/64_t. Für jeden Datentyp existiert eine
eigene Funktion, diese Funktionen enthalten jedoch alle den selben Code.
Um eine Copy&Paste-Orgie zu vermeiden, wurde eine Makro-Orgie gestartet,
was die Übersichtlichkeit nicht wirklich verbesserte, dafür müssen
Änderungen am Code nur an einer Stelle vorgenommen werden.
Eine Dokumentation existiert zur Zeit nicht, daher hier eine kurze
Anleitung:
1 | char *(u)int??str(char *target, (u)int??_t source)
|
Diese Funktionen wandeln einen Integer in einen String um. Dafür sollte
möglichst immer der kleinstmögliche Datentyp gewählt werden. Wenn ein
uint8_t umgewandelt werden soll, sollte auch uint8str(...) verwendet
werden, denn z.B. mit uint32str(...) kann die Umwandlung der gleichen
Variablen ca. 5 mal länger dauern.
1 | char *(u)fixint??str(char *target, (u)int??_t source, int_fast8_t cp)
|
Diese Funktionen wandeln Fixkommazahlen in Strings um. Der Wert von cp
bestimmt den Ort des Kommas. Ist cp z.B. 3, so wird aus 1234 1.234. Ist
cp -3, so wird aus 1234 1234000. Diese Funktionen sind eher
Speicherintensiv was den Programmspeicher anbelangt, daher sollten nicht
benötigte Funktionen auskommentiert werden, wenn kein Compiler verwendet
wird, der nicht benötigten Code nicht compiliert.
1 | char *strRalign(char *str, uint_fast8_t minlenght)
|
Diese Funktion richtet die erzeigten Strings nach rechts aus. minlenght
gibt dabei die Länge des zu erzeugenden Strings an. Ist der String
länger als minlenght, so wird der String nicht verändert.
Da alle Funktionen den Pointer zum String zurückgeben, kann ein nach
rechts ausgerichteter String in einer Zeile erzeugt werden:
1 | strRalign(uint16str(str,value),6);
|
Diese Funktionen sind mit meinem System (PIC18F452 + XC8-Compiler)
schneller, als itoa und utoa aus der Standardbibliothek, besonders wenn
8Bit Variablen umgewandelt werden müssen. Dafür kann bei meinen
Funktionen die Basis nicht gewählt werden, es ist also nur eine dezimale
Darstellung möglich.
Konstruktive Kritik, Verbesserungsvorschläge und Vorschläge für
Erweiterungen sind jederzeit willkommen. Falls jemand einen Fehler
findet, bitte ich ihn, dies mir mitzuteilen.