Noobie braucht dringend Hilfe!!! (Zeiger/Zeigerübergabe)



  • aber es geht schon weiter, liebe Freunde:
    "cannot convert 'student' to 'student' in assignment" heisst es für zeile 43, die da lautet:

    phelp->pnext = *pA;
    

    obwohl ich das fast 1:1 aus einem Beispielprogramm für diese Listen übernommen habe. Ich werd wahnsinnig.



  • phelp->pnext = pA;
    


  • Mmh.Danke. in dem Beispielprogramm sieht das aber irgendwie anders aus... egal.



  • mal ne frage zwischendurch
    student *&pA
    bedeutet das irgendwas?
    vlt zeiger auf referenz oder so?



  • Referenz auf Zeiger muesste es eher heissen. Zwar ungewoehlich, aber warum nicht 😉

    Gruss,
    DeSoVoDaMu



  • nee zeiger auf referenz (&*) geht nicht.
    es ist eine referenz auf pointer;
    Kurt



  • lookias schrieb:

    mal ne frage zwischendurch
    student *&pA
    bedeutet das irgendwas?
    vlt zeiger auf referenz oder so?

    Neee, n Zeiger auf ne Referenz wäre ein * pA&
    *&pA ist das gleiche wie pA, wenn das konstrukt überhaupt zugelassen ist.
    &pA gibt die Adresse zurück, an der pA steht, also einen Zeiger auf pA. der *-Operator dereferenziert das Dingen wieder so dass man wieder pA hat.



  • Yep, * und & lösen sich auf wie + und -. Wurde uns in der Übung gesagt. Aber der Funktionskopf ist uns in der Aufgabenstellung gegeben...

    Bin inzwischen ein Stück weiter, allerdings fällt mir hier bei der Aufgabenstellung schon nichts richtiges ein:
    int get_mean(student * pA, int matrnr, float & durchschnitt);Die Funktiom get_mean ermittelt den Durchschnitt aller bisher vom Studenten mit der Matrikelnummer matrnr erreichten Noten. Der berechnete Wert wird über den Referenzparameter durchschnitt zurückgegeben. Wenn ein Student mit der Matrikelnummer matrnr nicht existiert,so gibt die Funktion get_mean den Wert -1 zurück, sonst den Wert 0. Der Parameter pA stellt den Anfang der Liste dar, die nach dem der Studenten mit der Matrikelnummer matrnr durchsucht werden soll.
    ich versteh nicht so recht, wie ich den Durchschnitt zurückgeben soll...
    Könntet ihr mir wieder helfen?



  • aha
    also gehoert das zu den freiheiten des c++ programmierers mit falschem code richtige programme zu schreiben.

    was wuerde denn:
    int *pa&;
    bewerkstelliegn?



  • Sonja80 schrieb:

    ich versteh nicht so recht, wie ich den Durchschnitt zurückgeben soll...

    na einfach mit einer zuweisung

    durchschnitt = der_durchschnitt;
    

    das ist auch der grund warum durchschnitt ein referenz parameter ist.
    Kurt



  • lookias schrieb:

    was wuerde denn:
    int *pa&;
    bewerkstelliegn?

    Syntax error.
    Kurt



  • also:
    ich versteh nicht, wieso es im Kopf heisst "float & durchschnitt".
    hab ich jetzt damit eine float Variable definiert?
    dann rufe ich im Hauptprogramm die Funktion auf, in der dann der Durchschnitt errechnet wird, aber wie kann ich denn dann aus dem Hauptprogramm auf diese Variable der Funktion zugreifen?



  • du hast keine neue variable (bzw. Parameter) definiert, sondern eine Referenz. Eine Referenz arbeitet ähnlich wie ein Zeiger, nur dass man sie nicht dereferenzieren kann, und dass man sie nicht "umlenken" kann, d.h. sie verweisen auf immer dasselbe Objekt, sobald sie einmal zugewiesen wurden.

    Bsp:

    float& ra; //Referenz auf eine Fließkommazahl
    
      {
      float a; //eine ganz normale Fließkommazahl
    
      ra = 4;  //FEHLER!! ra ist noch an kein Objekt "gebunden"
    
      ra = a;  //hiermit bezieht sich ra für immer auf a
    
      a = 4;   // in ordnung, a ist jetzt 4 (und damit auch ra)
      ra = 6;  // in ordnung, a ist jetzt 6 ...
    
      }  // gültigkeitsbereich von a wird verlassen...
    
    ra = 7  // FEHLER!! a existiert nicht mehr, damit darf auch ra nicht verwendet werden
    
    float b;
    ra = b;  //FEHLER!! ra kann nur einmal an ein Objekt "gebunden" werden
    

    Ich hoffe, das verdeutlicht in etwa die Benutzung von Referenzen.
    wenn du also deiner Referenz was zuweist, wird die Zahl, die du beim Aufruf der Funktion an die Referenz übergibst, genauso verändert...



  • int get_mean(student * pA, int matrnr, float & durchschnitt) {
        int gefunden = -1;
       // student suchen
       // wen gefunden durchschnitt berechnen 
       .....
       durchschnitt = berechneter_durchschnitt;
       ....
       return gefunden;
    }
    
    int main() {
       student * pA;
       float notendurchschnitt;
       int nr = 5321;   
    
       if ( 0 == get_mean( pA, nr, notendurchschnitt ) )
          cout << "Notendurchschnitt = " << notendurchschnitt << endl;
       else 
          cout << "der Student mit der  Matrikelnummer " << nr << "existiert nicht" << endl;
    }
    


  • ok, und in der Funktion arbeite ich dann mit dem Synonym "durchschnitt", womit auch immer die Variable, die ich an die Funktion übergeben habe, global verändert wird. richtig? wobei ich ja auch gleich in der Funktion mit der globalen Variable arbeiten könnte, oder?



  • Sonja80 schrieb:

    ok, und in der Funktion arbeite ich dann mit dem Synonym "durchschnitt", womit auch immer die Variable, die ich an die Funktion übergeben habe, global verändert wird. richtig? wobei ich ja auch gleich in der Funktion mit der globalen Variable arbeiten könnte, oder?

    Eigentlich schon aber globale variablen sind bööööööse.
    Kurt



  • Ok, dank ZuK hab ichs endgültig kapiert... THX!!!



  • ZuK schrieb:

    Eigentlich schon aber globale variablen sind bööööööse.

    War das ironisch gemeint?



  • eigentlich nicht. denk nur daran wass passiert wenn du lokale variablen mit dem gleichen namen definierst.
    Kurt



  • mit Sicherheit nicht. globale Variablen sind wirklich schrecklich, sobald der Code über 20 Zeilen deutlich hinausgeht 😉

    der Clou an den Referenzen als Parameter ist ja, dass du an der Stelle des Aufrufs festlegen kann, in welche Variable deine Funktion den Durchschnitt speichern soll (muss ja nicht immer die selbe sein). Das kann durchaus auch eine sein, die irgendwo ganz versteckt in einem sehr lokalen Gültigkeitsbereich existiert (z.B. in einer anderen Funktion)


Anmelden zum Antworten