Ein Makro der seltenen Art?



  • Hallo

    ich will in meinem Quellcode Copy-Paste-Fehler vermeiden, weil ich folgendes entsprechend jetzt zigmal haben werde

    aHsDyn.Pos.Lat = InterpolateAngleData(aIt_alt->second.Pos.Lat,aIt_neu->second.Pos.Lat );
    aHsDyn.Pos.Lon = InterpolateAngleData(aIt_alt->second.Pos.Lon,aIt_neu->second.Pos.Lon );
    

    In der 1.Zeile ist "Pos.Lat" 3mal enthalten.
    In der 2. Zeile ist "Pos.Lon" 3mal enthalten.

    Deshalb dachte ich, da wird doch ein Makro das Leben vereinfachen und habe folgendes versucht.

    #define INTERPOL_ANGLE(NAME) aHsDyn.##NAME = InterpolateAngleData((double)aIt_alt->second.##NAME,(double)aIt_neu->second.##NAME )
    
    INTERPOL_ANGLE(Pos.Lat);
    

    Aber ich bekomme den Fehler(3x) für das makro

    error: pasting "." and "Pos" does not give a valid preprocessing token

    ich vermute, dass bedeutet, dass die Kombination ".##NAME" nicht zulässig ist...aber warm nicht?

    Ich habe nun noch versucht mittels "( )" und ähnlichen den Fehler loszuwerden, aber es hat auch nichts geholfen.

    langsam glaube ich, dass das, was ich machen will, nicht geht.

    Hat jemand eine Idee?


  • Mod

    Du willst hier keine Makros, dadurch machst du dir das Leben nur schwerer.

    PosType InterpolateAngleData(const &PosType oldval, const &PosType newval)
    {
     // Hier das hin, was deine beiden Zeilen effektiv gemacht haben
    }
    
    // [...]
    
    aHsDyn.Pos = InterpolateAngleData(aIt_alt->second.Pos, aIt_neu->second.Pos);
    

    Da ich nicht genau weiß, was die Sachen genau sein sollen, kann dieser Vorschlag unpassend sein, jedoch sollte er dir eine designtechnisch bessere Richtung zeigen.

    P.S.:

    1. aHsDyn ? Ist das etwa ungarische Notation? Wozu?
    2. aHsDyn.Pos = ... Ist bei deinen Klassen alles public? Wie wäre es mit etwas Kapselung?


  • hi und erstmal danke für die schnelle Antwort

    1. bitte keine Notationsdiskussion

    2. das sind keine Klassen sondern große IF-Strukturen(c-typen) die im Netzwerk verschickt werden.

    3. Deine Beispielmethode ist das Äquivalent zu meiner Methode mti dem namen
    "InterpolateAngleData" und würde nicht das Copy/Paste-Problem lösen.

    Ich suche allerdings eine Lösung wo ich nicht 3x den Variablennamen schreiben muss.
    so halt irgendwie

    INTERPOL_ANGLE(Pos.Lat);
    

    Ein Template hilft da m.E. übrigens auch nicht.

    Und immer drann denken, wir reden hier nicht nur von den 2 exemplarischen Zeilen sondern von Vielen Zeilen.


  • Mod

    HeroHolger schrieb:

    1. bitte keine Notationsdiskussion

    Angst, dass deine Notation nichts taugt?

    2. das sind keine Klassen sondern große IF-Strukturen(c-typen) die im Netzwerk verschickt werden.

    Ok, das ist doch schon mal was.

    3. Deine Beispielmethode ist das Äquivalent zu meiner Methode mti dem namen
    "InterpolateAngleData" und würde nicht das Copy/Paste-Problem lösen.

    Doch, denn du müsstest es nur ein einziges Mal richtig hinschreiben, dann benutzt du immer die Methode. Das ist die gleiche Idee wie mit den Makros, nur ohne die Probleme von Makros.

    Ich suche allerdings eine Lösung wo ich nicht 3x den Variablennamen schreiben muss.
    so halt irgendwie

    INTERPOL_ANGLE(Pos.Lat);
    

    😕 Das leistet die Funktion doch.



  • zu 3. nein, das tut sie nicht.

    du musst 3x mal den Variablennamen hinschreiben. und das will ich eben nicht.



  • HeroHolger schrieb:

    aHsDyn.Pos.Lat = InterpolateAngleData(aIt_alt->second.Pos.Lat,aIt_neu->second.Pos.Lat );
    aHsDyn.Pos.Lon = InterpolateAngleData(aIt_alt->second.Pos.Lon,aIt_neu->second.Pos.Lon );
    

    [...]

    #define INTERPOL_ANGLE(NAME) aHsDyn.##NAME = InterpolateAngleData((double)aIt_alt->second.##NAME,(double)aIt_neu->second.##NAME )
    
    INTERPOL_ANGLE(Pos.Lat);
    

    Was erhoffst du dir von dem ##-Operator? Lass den mal weg.


  • Mod

    HeroHolger schrieb:

    Aber ich bekomme den Fehler(3x) für das makro

    error: pasting "." and "Pos" does not give a valid preprocessing token

    ich vermute, dass bedeutet, dass die Kombination ".##NAME" nicht zulässig ist...aber warm nicht?

    Die Fehlermeldung ist eigentlich eindeutig. Die einzigen Token, die mit . beginnen, sind die . und .* Operatoren, die ... Ellipse, sowie bestimmte (Gleitkomma-)Literale.
    Verlier einfach den ##-Operator an dieser Stelle.



  • Ansonsten schreibst Du dreimal das Makro im Text.
    Eine Funktion/Mehtode ist definitiv der bessere Weg.
    Makros sind mies (persönliche Meinung und Erfahrung)
    Makros & objektorientierte Programmierung sind scheisse.



  • @camper + @Bashar

    Was erhoffst du dir von dem ##-Operator? Lass den mal weg.

    schaust du hier
    http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html#Concatenation

    so in etwa will ich das haben. ohne ## kommst du m.E. nicht weit.

    Wenn du ohne ## arbeitest weiß der precompiler garnicht, was du machen willst.



  • HeroHolger schrieb:

    ohne ## kommst du m.E. nicht weit.

    Tu's doch einfach... 🙄



  • @Swordfish: oha, manchmal ist die Lösung doch so nahe. er scheint das wirklich zu akzeptieren ^^


  • Mod

    HeroHolger schrieb:

    @camper + @Bashar

    Was erhoffst du dir von dem ##-Operator? Lass den mal weg.

    schaust du hier
    http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html#Concatenation

    so in etwa will ich das haben. ohne ## kommst du m.E. nicht weit.

    Wenn du ohne ## arbeitest weiß der precompiler garnicht, was du machen willst.

    Welcher Precompiler?
    Der Link beantwortet übrigens nicht die Frage.



  • HeroHolger schrieb:

    @camper + @Bashar

    Was erhoffst du dir von dem ##-Operator? Lass den mal weg.

    schaust du hier
    http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html#Concatenation

    Du bist ja mal ein Scherzkeks 🙄



  • ok

    Danke erstmal nochmal an Alle die mir geholfen!

    Thread kann zugemacht werden.

    Der Fehler saß wie üblich vorm Monitor ^^



  • HeroHolger schrieb:

    Der Fehler saß wie üblich vorm Monitor ^^

    Die kanonische Variante wäre "Fehler existiert zwischen Tastatur und Sessel".


Anmelden zum Antworten