Forum: Mikrocontroller und Digitale Elektronik Kompakte Array-Initialisierung in C


von batman (Gast)


Lesenswert?

Moin,
ich glaube es gibt keinen besseren Trick, größere Byte-Array-Records mit 
numerischen (Hex-)Konstanten aus dem C-Code zu initialisieren, als diese 
aufgeblähte unübersichtliche Standard-Schreibweise oder?

{0x0C,{0x01,0x72,0xAC,0x00},{0x88,0x88,0x48,0x88,0x48,0x08}}

Gewünscht wäre diese Richtung:
0C:0172AC00:888848884808

von Nop (Gast)


Lesenswert?

batman schrieb:

> ich glaube es gibt keinen besseren Trick, größere Byte-Array-Records mit
> numerischen (Hex-)Konstanten aus dem C-Code zu initialisieren, als diese
> aufgeblähte unübersichtliche Standard-Schreibweise oder?

Zum einen muß man natürlich aufpassen, daß die Endianess des Hostsystems 
da keinen Einfluß bekommt. Zum anderen geht es aber ja auch nicht um 
numerische Dinge, sondern um Textsubsitution. Könnte man nicht den 
Präprozessor dafür einspannen, aus der Komfortnotation mit ein paar 
Makros die Standard-Initialisierung zu machen?

Alternativ könnte man natürlich auch in die Buildchain ein Tool 
einbauen, was derlei Strings aus einem Textfile oder so liest und daraus 
dann ein C-File mit den Variablen in C-Notation autogeneriert. Das müßte 
man dann bloß noch im gewünschten Quelltextfile includieren.

Sowas in der Art habe ich im Einsatz für den Include von Binärdateien, 
die vorher erst parametriert auf dem Host erzeugt werden.

von batman (Gast)


Lesenswert?

Ja, automatisiert in eine (aufgeblähte) Include-Datei übersetzen ist 
eine Möglichkeit.
Würde mich natürlich auch interessieren, ob man da mit reiner 
Makro-Strickerei ohne Extra-Dateien was machen kann. Ich bin da leider 
nicht so begabt.

von batman (Gast)


Lesenswert?

Wäre dann z.B. sowas:

#define blowup(DATA) ..???...

bla = blowup(0172AC00);

ersetzt der Präprozessor zu

bla = {0x01,0x72,0xAC,0x00};

von Nop (Gast)


Lesenswert?

Ja, genau an sowas dachte ich. Einfacher könnte es sein, bei den 
Eingabedaten gleich blowup(01 72 AC 00) schreibt. Das geht mit 
variadischen Macros (solche, die eine variable Zahl von Argumenten 
annehmen).

Guck mal hier: https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

von Daniel A. (daniel-a)


Lesenswert?

@batman

Das ist mit Makros so nicht möglich, weil man keinen String aufspalten 
kann. Mit C++11/C++14 könnte man sowas ähnliches mit templates und/oder 
constexpr funktionen lösen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.