Kurzer Alias-Name für struct-Element

#4517611
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.
#4517665
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)])
#4517675
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.
#4517704
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?
Gast #4520291
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.
#4520300
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.
Gast #4520429
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.
#4520617
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.)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren