Forum: Compiler & IDEs Kurzer Alias-Name für struct-Element


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

ich habe ein großes Struct (AVR-GCC), bei dem mir die sprechenden Namen 
vor Variablen gerade gehörig auf den Geist gehen. Es sieht ungefähr so 
aus:
1
constflash dataset_t dataset[] =
2
{
3
    { TXTSUBSYS1_VAR1 , uint8  , {.puint8=&GSettings.Subsys1.var1}  , SS1V1_DEFAULT, SS1V1_MIN, SS1V1_MAX },
4
    { TXTSUBSYS1_VAR2 , uint8  , {.puint8=&GSettings.Subsys1.var2}  , SS1V2_DEFAULT, SS1V2_MIN, SS1V2_MAX },
5
    { TXTSUBSYS2_VAR1 , uint16 , {.puint16=&GSettings.Subsys2.var1} , SS1V1_DEFAULT, SS2V1_MIN, SS2V1_MAX },
6
    { TXTSUBSYS2_VAR2 , int16  , {.pint16=&GSettings.Subsys2.var2}  , SS1V1_DEFAULT, SS2V2_MIN, SS2V2_MAX },
7
}

In Wirklichkeit sind die Namen noch etwas sprechender und auch leider 
etwas länger - das Struct ist unübersichtlich geworden und für einen 
ordentlichen horizontalen Scrollbalken verantwortlich.

In einer Funktion hätte ich jetzt ein paar Zeiger mit kurzem Namen 
vergeben, um die Sache etwas zu entspannen, in etwa so:
1
void foo(void)
2
{
3
    Subsysdata1_t Ss1 = &GSettings.Subsys1;
4
    Subsysdata2_t Ss2 = &GSettings.Subsys2;
5
}
was die Sache etwas übersichtlicher gemacht hätte. Das große Struct 
liegt allerdings im Flash.

Gibt es bei einem globalen Struct eine Möglichkeit, für Zeiger kürzere 
"alias"-Namen zu erzeugen? Oder wie würden langjährige C-Programmierer 
soetwas angehen? Muß ich hier die define-Keule herausholen?

Viele Grüße
W.T.

von Bernd K. (prof7bit)


Lesenswert?

Walter T. schrieb:
> constflash dataset_t dataset[] =
> {
>     { TXTSUBSYS1_VAR1 , uint8  , {.puint8=&GSettings.Subsys1.var1}  ,
> SS1V1_DEFAULT, SS1V1_MIN, SS1V1_MAX },
>     { TXTSUBSYS1_VAR2 , uint8  , {.puint8=&GSettings.Subsys1.var2}  ,
> SS1V2_DEFAULT, SS1V2_MIN, SS1V2_MAX },
>     { TXTSUBSYS2_VAR1 , uint16 , {.puint16=&GSettings.Subsys2.var1} ,
> SS1V1_DEFAULT, SS2V1_MIN, SS2V1_MAX },
>     { TXTSUBSYS2_VAR2 , int16  , {.pint16=&GSettings.Subsys2.var2}  ,
> SS1V1_DEFAULT, SS2V2_MIN, SS2V2_MAX },
> }

Das sieht für mich aus als könnte man diesen Code mit nem kleinen Script 
automatisch generieren wenn das wirklich noch länger so geht und immer 
nur aus den selber Kombinationen von irgendwasVAR1 und irgendwasVAR2 
besteht:
1
generate_whatever([
2
    (1, 8,  1, 1),
3
    (2, 8,  1, 2),
4
    (1, 16, 2, 1),
5
    (1, 16, 2, 2)])

von Walter T. (nicolas)


Lesenswert?

Bernd K. schrieb:
> [...] wenn das wirklich noch länger so geht und immer
> nur aus den selber Kombinationen von irgendwasVAR1 und irgendwasVAR2
> besteht:

Geht es nicht. Die Namen sind nur als Beispiel gedacht. In Wirklichkeit 
sind das sprechende Namen.

Welcher Mensch mit Verstand würde Daten mit zwei Indizes (SubsysX, VarY) 
in struct-Namen packen? Soetwas machen doch nur Codegeneratoren. Hoffe 
ich.

von Bernd K. (prof7bit)


Lesenswert?

Walter T. schrieb:
> Welcher Mensch mit Verstand würde Daten mit zwei Indizes (SubsysX, VarY)
> in struct-Namen packen? Soetwas machen doch nur Codegeneratoren. Hoffe
> ich.

Ohne zu wissen wie die wirklich heißen und welchem Zweck die dienen kann 
man nur spekulieren wer das getan hat oder warum.

Deine Frage ist auch ziemlich schwammig formuliert und es ist nicht 
wirklich klar was Du eigentlich bezwecken willst. Existiert dieses 
Monster-Struct-Array schon und es ist nur zu umständlich zu verwenden 
oder suchst Du einen Weg es einfacher hinzschreiben? Enthält es in 
Wirklichkeit genausoviel Redundanz in den ellenlangen fast gleichen 
Namen wie in dem Beispiel mit den Phantasiebezeichnern? Dann bau einen 
Codegenerator (in Python, Perl, whatever, oder evtl auch einfach nur mit 
Makros oder X-Makros). Wenn jedoch überhaupt keine Redundanz drin ist, 
wie willst Du dann Schreibarbeit sparen?

von Marc (Gast)


Lesenswert?

Was hindert einen das ganze per Preprozessor zu lösen?
1
#define Ss1 GSettings.Subsys1
2
#define Ss2 GSettings.Subsys2
Mmmm, das wäre zu einfach, das hat der TO sicher nicht gemeint...

von Marc (Gast)


Lesenswert?

Ahhh sorry, erst jetzt habe ich in der letzten TO Zeile das 
"define-Keule herausholen?" gelesen. OK, darfst mich hauen...

von Sebastian S. (amateur)


Lesenswert?

Ich würde das Ganze auch mit Hilfe von Makros lösen oder mal über den 
geschickten Gebrauch der Return-Taste, zusammen mit einer sinnvollen 
Nutzung von Tabulatoren, nachdenken. Am besten so, dass die 
"geschweiften" Bereiche auch weiterhin erkennbar sind.

von W.S. (Gast)


Lesenswert?

Walter T. schrieb:
> TXTSUBSYS1_VAR1

Tja, das Erfinden von wirklich sinnvollen Namen ist offensichtlich in 
Vergessenheit geraten. Dabei wäre genau dieses wohl der Schlüssel zum 
finalen Erfolg.

Merkt ihr was?
Statt griffiger Worte versuchen die Leute heutzutage, gewaltigste 
Bedeutungen in abgekürzter und damit unverständlichr Form in jeden 
Identifier zu drücken.

Wer also die Kniebeuge hinbekommt, anstatt eines "word" sowas wie 
"uint16_t" hinzuschreiben und sich dabei sogar noch modern fühlt, der 
muß eben auch mit Wörtern a la "dataset.TXTSUBSYS1_VAR1" anstatt 
"set1.index" leben.

W.S.

von Walter T. (nicolas)


Lesenswert?

W.S. schrieb:
> Merkt ihr was?
> Statt griffiger Worte versuchen die Leute heutzutage, gewaltigste
> Bedeutungen in abgekürzter und damit unverständlichr Form in jeden
> Identifier zu drücken.

Hm. Genauso könnte man davon ausgehen, daß meine Funktionen alle foo() 
oder bar() heißen und Variablen alle 'a', 'b' oder 'c'? Leider bin ich 
aber so gemein und versuche bei Forenanfragen von meinem konkreten Fall 
zu abstrahieren.

&GSettings.Subsys1.var1 heißt in Wirklichkeit 
&GSettings.Motor[0].zMaxDefaultMM, aber dieses Wissen bringt die 
Fragestellung kein bischen weiter.

von Tom (Gast)


Lesenswert?

Je nach Anforderung hätte ich keine Skrupel, eine Getter-Funktion zu 
bauen. Dann steht der Wust nur an einer Stelle.
1
inline int cup_size(void)
2
{
3
    return global.config[HOUSE].pkitchen->drinks[COFFEE].cup.containersize;
4
}
Echte C-Programmierer würden das aus religiösen Gründen aber nie tun.

von Walter T. (nicolas)


Lesenswert?

Tom schrieb:
> Je nach Anforderung hätte ich keine Skrupel, eine Getter-Funktion zu
> bauen.

Wäre das große struct nicht im Flash, wäre das eine Option, die ich auch 
in Erwägung gezogen hätte. (Das struct im Flash enthält einen Zeiger auf 
eine Variable im SRAM).

Im konkreten Fall habe ich das jetzt gelöst, indem ich die globale 
Variable "GSettings" in "GSet" umgenannt und von 
unterstrich_schreib_weise zu lowerCamelCase gewechselt habe - das hat 
mir ausreichend Zeichen gespart, um sogar mein 
90-Zeichen-pro-Zeile-Limit nicht mehr zu verletzten.

Aber eine Allgemeinlösung ist das ja auch nicht.


(OK, der richtige Programmierer hätte natürlich 
weise_schreib_strich_unter geschrieben.)

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.