Anfänger: Pointer auf Struct
-
Hallo
ich bin in C/C++ noch blutiger Anfänger! Ich bin erst seit ein paar Wocen dabei mich einzuarbeiten und das auch nur nebenbei.
Ich gehe zzt die ganzen Übungsaufgaben der verschiedenen UNIs, die man so im Netz findet durch.
Ein Problem haben ich zzt bei einer Aufgabe zur Berechnung von Zins und Tilgung.
Das Probllem tritt hier auf:
struct sJahrMon // Datentyp zur Aufnahme vom Jahr und Monat { int Jahr; int Mon; }; sJahrMon* pJuM; void mon2jahr(int monate,sJahrMon* JuM) // Umwandlung von Monatsnummer nach Jahr und Monat { JuM.Mon = monate%12; JuM.Jahr = (monate-monate%12)/12; }das ergibt Folgende Fehlermendungen:
/Zinsrechnung/main.cpp|36|Fehler: Abfrage des Elementes »Mon« in »JuM«, das vom Nicht-Klassentyp »sJahrMon*« ist| /Zinsrechnung/main.cpp|37|Fehler: Abfrage des Elementes »Jahr« in »JuM«, das vom Nicht-Klassentyp »sJahrMon*« ist|außerdem gibt es beim Aufruf der Funkrion auch noch Fehler, die sich aber evtl auflösen wenn der Fehler in der Funktion gelöst ist.
mon2jahr(i,pJuM*);/Zinsrechnung/main.cpp|66|Fehler: expected primary-expression before »)« token|Ein Hinweis auf die Ursache währe mir sogar lieber als gleich die Löung... Würde gerne so viel wie möglich selbst rausfinden, weils dann einfach besser im Kopf bleibt.

Danke
Christian
-
struct sJahrMon // Datentyp zur Aufnahme vom Jahr und Monat { int Jahr; int Mon; }; sJahrMon* pJuM; void mon2jahr(int monate,sJahrMon* JuM) // Umwandlung von Monatsnummer nach Jahr und Monat { JuM.Mon = monate%12; // . operator geht hier nicht, da musst du den -> operator verwenden JuM.Jahr = (monate-monate%12)/12; }Wenn du zeiger auf Klassen oder Strukturen verwendest, solltest du immer den -> operator nutzen anstatt den . operator.
Also so hier:void mon2jahr(int monate,sJahrMon* JuM) // Umwandlung von Monatsnummer nach Jahr und Monat { JuM->Mon = monate%12; // . operator geht hier nicht, da musst du den -> operator verwenden JuM->Jahr = (monate-monate%12)/12; }
-
Du musst eben den Zeiger wie alle Zeiger zuerst dereferenzieren, bevor du mit dem Typ dahinter arbeiten kannst.
Das machst du mit
operator*:void mon2jahr(int monate, sJahrMon* JuM) { (*JuM).Mon = ...; (*JuM).Jahr = ...; }Und weil man das relativ häufig antrifft, gibts wie von FireFighter angedeutet den
operator->, der einfacher zu lesen ist.void mon2jahr(int monate, sJahrMon* JuM) { JuM->Mon = ...; JuM->Jahr = ...; }Wenn die Operatoren nicht überladen wurden, sind die Schreibweisen
(*Instance).MemberundInstance->Membersemantisch äquivalent.
-
Danke, nur so zum Verständnis, liegt das daran, dass das Objekt/Struct außerhalb der Funktion erzeugt wurde und ich mit dem Bezeichner explizid eine ebene nach oben wechseln muß?
Wie sieht es mit dem 2. Problem aus?
mon2jahr(i,pJuM*);/Zinsrechnung/main.cpp|66|Fehler: expected primary-expression before »)« token|Vom gefühl her würde ich sagen das der Funktionsaufruf völlig OK ist. Zumindest wenn es sich nicht um ein Struct handelt klappt es so.
vielen Dank
Christian
-
Hmm so richtig will ich nicht begreifen was du mit dem Aufruf bezwecken willst? Bezüglich auf deine Funktion müsste er wohl eher so aussehen wenn mich nicht alles täuscht:
mon2jahr(i,pJuM);Angenommen wir reden von dem
pJuMwas du da so global deklariert hast.
-
struct sJahrMon { int Jahr; int Mon; }; sJahrMon* pJM; void mon2jahr(int monate, sJahrMon* pJM) { pJM->Mon = monate % 12; pJM->Jahr = (monate - monate % 12) / 12; } ... mon2jahr(1, pJM);Bitte Grundlagen anschauen

-
Da es noch niemand erwähnt hat, mach ich das jetzt mal.

Nicht vergessen Speicher für pJM zu vereinbaren.
-
Danke an alle!
Das Problem ist gelöst.