[C]Platzhalter in struct programmieren?

Herakles

Profifragensteller
Moin!

Ich implementiere gerade eine Stuerung für einen Motor und in der Spezifikation des Motorprotokolls gibt es in einem Telegramm immer wieder Bytes, die ungenutzt sind.

Nun möchte ich gern ein struct aufbauen, dass die Struktur dieses Protokolls umfasst. Das sieht dann etwas so aus:

Code:
struct protokoll {
   uint8_t zaehler;
   uint8_t identifikation;
   uint8_t unbenutzt_1;
   uint8_t modus;
   uint8_t unbenutzt_2;
(...)
}

Nun kann ich das struct weiter so aufbauen, wie dort gesehen und bei allen ungenutzten Bytes ein "unbenutzt_X" schreiben - aber gibt es dafür eine passendere, elegantere Lösung? Ein "Platzhalter" im struct?

Vielen Dank für jede Idee,
Herakles
 
meistens heissen die dinger nicht "unbenutzt" sondern "rfu" oder so etwas.

aber ehrlich gesagt sieht es fuer mich so aus als ob "identifikation" und "modus" einfach 16 bit werte sind. little endian.
 
Klar ist mir das bekannt, nur wie Du siehst, sind das keine zusammenhängenden "Platzhalter"... Von daher passt an der Stelle nicht wirklich in Array. Die einzelnen Bytes möchte ich nicht gern in ein einziges Array packen, weil ich nicht via Index zugreifen möchte, sondern schon im struct mit Namen arbeiten will.

Naja...
 
Wenn du wirklich ungenutzte Felder in deinen Structs hast bleiben sie dennoch Elemente deines Structs und müssen deklariert werden. Außer hässlichen macros die __LINE__ und ## benutzen fällt mir da nix ein das weniger zu Tippen wäre.
 
Du kannst einfach nur den Typ Deklarieren, ohne einen Namen zu vergeben. Oder nenne die Dinger reserved_n.
 
Klar ist mir das bekannt, nur wie Du siehst, sind das keine zusammenhängenden "Platzhalter"... Von daher passt an der Stelle nicht wirklich in Array. Die einzelnen Bytes möchte ich nicht gern in ein einziges Array packen, weil ich nicht via Index zugreifen möchte, sondern schon im struct mit Namen arbeiten will.

Naja...

Du könntest ja trotzdem alles in ein Feld packen und einfach ein paar Pointer mit Namen anlegen. Verschwendet zwar Platz, aber das tust du durch das speichern von leeren Feldern sowieso. Dann wäre die Daten alle sequentiell abgelegt und du kannst das interface einfach erweitern.
 
Also gut - meine Quintessenz aus diesem Thread ist: Es gibt keine eingehende, auf der Hand liegende Lösung, die das löst, was ich angedacht hatte. Im Grunde genommen wollte ich mich auch nur versichern, dass es nicht eine Möglichkeit gibt, die ich gerade übersehen hatte.

In dem Sinne ist also alles gut. Danke für Eure Tipps und Gedanken zum Thema!

Herakles
 
Nein diese Perversion habe ich so noch nirgendwo gesehen. Allerdings habe ich nur sehr kleine Ausschnitte des Linuxkernels gelesen und in den PulseAudio Code musste ich zum glück noch nie einen Blick werfen. Ich habe gesehen das es Redundanz gibt in den Deklarationen diese in einem Marco versteckt. Um die Namen eindeutig zu halten habe ich noch __LINE__ benutzt und ## um die Tokens zu verketten. Dieses Gebilde fand ich allerdings so widerlich das ich es eigentlich nicht Posten wollte. Nun hörte Herakles nicht auf zu fragen also bekam er was er wollte.
 
Das Makro funktioniert so nicht. Aus
Code:
#define DUMMY(n) uint8_t dummy_##__LINE__[n]
DUMMY(1)
wird (gcc -E bla.c)
Code:
uint8_t dummy___LINE__[1]
Korrekt funktioniert Folgendes:
Code:
#define CONCAT_(a, b) a##b
#define CONCAT(a, b)  CONCAT_(a, b)
#define DUMMY(n)      uint8_t CONCAT(dummy_, __LINE__)[n]
Das hängt damit zusammen, in wann Makros/Makroargumente ausgewertet werden.
 
Ups stimmt. Ich habe es halt nicht getestet. Wobei es besser wäre diesen ganzen Thread zu löschen.
 
Und wenn er dann doch irgendwann auf die reservierten Bereiche
zugreifen will, um z.B. zu "optimieren" muss er erst wieder die Namen
zusammenfriemeln ;)

P.S.: Ich wäre auch für Löschung des Threads, um etwaigen Missbrauch
zu unterbinden!
 
Also gut - meine Quintessenz aus diesem Thread ist: Es gibt keine eingehende, auf der Hand liegende Lösung, die das löst, was ich angedacht hatte. Im Grunde genommen wollte ich mich auch nur versichern,

Du hast den ganzen Thread veranstaltet, nur um dich davon zu überzeugen, dass du auf eine Frage mehrere unterschiedliche Antworten bekommst? Da kennst du aber BSDForen schlecht ;)
 
Zurück
Oben