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



  • Moin!
    Ich soll bis Freitag ein Programm zusammenbasteln, das eine Liste von Studenten und deren Daten erstellt. Genaue Aufgabenstellung hier.
    Bis jetzt hab ich erstmal das geschrieben:

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    struct student 
    {       
        char name[40];
        char vorname[20];
        char fach[40];
        int matrikelnummer;
        float noten[20];
        student *pnext;
    };
    
    int initialize(student *&pA)
    {   
        int n;
        cout<<"Wieviel neue Studenten möchten sie zur Liste hinzufügen?";
        cin>>n;
        if (n=0)
            return 0;
        else
        {  
           for (int i=1; i<=n; i++) 
           {
            student * phelp;
            phelp = new student;
            cout << "Nachnahme: ";
            cin >> phelp->name;
            cout << "Vorname: ";
            cin >> phelp->vorname;
            cout << "Studienfach: ";
            cin >> phelp->fach;
            cout <<"Matrikelnummer: ";
            cin >> phelp->matrikelnummer;
            for (int j=0; j<20; j++) phelp->noten[j]=0; 
            phelp->pnext = NULL;
    
            if ((pA==NULL) || (strcmp(phelp->name, pa->name)<0))
            {
                phelp->pnext = *pA;
                *pA = phelp;
            }
            else
        	{
            	student *prun;
            	prun = *pA;
    
                while((prun->pnext != NULL) && (strcmp(prun->pnext->name, phelp->name)<0))
            	  prun = prun->pnext;      
            	phelp->pnext = prun->pnext;
            	prun->pnext = phelp;
            }
           }   
        };     
    
    int main()
    {student *pA=NULL;
        return 0;}
    

    Is noch lange nich fertig, aber ich hab ja auch erst angefangen.
    Jetzt sagt mir mein Compiler für Zeile 41, wo in der bedingung für die if-Anweisung (pA==NULL) steht, "pa undeclared (first use in this function)", aber ich habe den Zeiger doch im Kopf definiert....

    Ich weiss nicht weiter, helft mir bitte...



  • soll wahrscheinlich heissen
    [cpp] if ((pA==NULL) || (strcmp(phelp->name, pA->name)<0))[/cpp]
    und wahrscheinlich meinst du weiter oben

    if (n==0)return 0;
    

    Kurt



  • Oh, mein Gott, und ich hab immer nur auf das erste pA gekuckt (pA==0)...lol
    Und danke für den Tip weiter oben, aber da gab es gar keine fehlermeldung...



  • Das ist auch legaler code. n wird 0 zugewiesen das ergebnis ist immer false.
    Um diesen fehler nicht zu machen hab ich mir angewöhnt es so zu schreiben.

    if (0 == n)return 0;
    

    Kurt



  • 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!!!


Anmelden zum Antworten