Kurzer Alias-Name für struct-Element

OP #4517611
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
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)])
OP #4517675
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
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 #4517774
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...
#4517796
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.
Gast #4520291
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.
OP #4520300
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
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.
OP #4520617
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.