Fragen zu Listing



  • Hi, ich hab ein paar Fragen zu folgendem Listing:

    #include <iostream>
    
    using namespace std;
    
    struct geburtstage {
        char name[50];
        int tag;
        int monat;
        int jahr;
    };
    
    const int DATA = 10;
    
    void input( int& zaehler, struct geburtstage* ptr );
    void output( int zaehler, struct geburtstage* ptr );
    
    int main()
    {
        struct geburtstage geb[DATA];
        int zaehler = 0, wahl;
        do
        {
            cout << "\nGeburtstage-Verwaltung\n";
            cout << "------------------------\n";
            cout << "-1- Eingeben" << endl;
            cout << "-2- Ausgeben" << endl;
            cout << "-3- Ende" << endl;
            cout << "Ihre Auswahl bitte: ";
            cin >> wahl;
            switch ( wahl )
            {
                case 1 :
                input( zaehler, geb );
                break;
    
                case 2 :
                output( zaehler, geb );
                break;
    
                case 3 :
                break;
    
                default :
                cout << "Falsche Eingabe" << endl;
            }
        }
        while( wahl != 3);
        return 0;
    }
    
    void input( int& zaehler, struct geburtstage* ptr )
    {
        cout << "Name: ";
        cin >> ptr[zaehler].name;
        cout << "Tag: ";
        cin >> ptr[zaehler].tag;
        cout << "Monat: ";
        cin >> ptr[zaehler].monat;
        cout << "Jahr: ";
        cin >> ptr[zaehler].jahr;
        zaehler++;  
    }
    
    void output( int zaehler, struct geburtstage* ptr )
    {
        for(int i = 0; i < zaehler; i++)
        {
            cout << ptr[i].name << " - "
                 << ptr[i].tag << "."
                 << ptr[i].monat << "."
                 << ptr[i].jahr << endl;
        }
        cout << "\n\n";
    }
    

    1. Warum wird in folgender Zeile nur die Adresse von zaehler übergeben und nicht zaehler selbst?

    void input( int& zaehler, struct geburtstage* ptr )
    

    2. Warum wird hier nicht mit dem Pfeiloperator (->) gearbeitet? ptr ist doch ein Zeiger, müsste dass nicht einen Fehler hervorrufen?

    void input( int& zaehler, struct geburtstage* ptr )
    {
        cout << "Name: ";
        cin >> ptr[zaehler].name;
        cout << "Tag: ";
        cin >> ptr[zaehler].tag;
        cout << "Monat: ";
        cin >> ptr[zaehler].monat;
        cout << "Jahr: ";
        cin >> ptr[zaehler].jahr;
        zaehler++;  
    }
    
    void output( int zaehler, struct geburtstage* ptr )
    {
        for(int i = 0; i < zaehler; i++)
        {
            cout << ptr[i].name << " - "
                 << ptr[i].tag << "."
                 << ptr[i].monat << "."
                 << ptr[i].jahr << endl;
        }
        cout << "\n\n";
    }
    

    Danke im voraus 🙂



  • Der Zähler wird per Referenz ( & ) übergeben, damit das Hochzählen auch einen Einfluss auf den Zähler im Programm hat. Du brauchst kein -> da dies bei array[i] automatisch gemacht wird.

    Das Programm wird krachen wenn der allokierte Speicher voll ist ... versuch mal 11 Adressen einzugeben. Du solltest in der Input darauf achten und evtl. kein neuen Datensatz anlegen wenn zaehler == DATA


  • Mod

    Du hast in beiden Fällen unrecht:

    void input( int& zaehler, struct geburtstage* ptr )
    

    Das &-Zeichen hat hier eine andere Bedeutung als der Adressoperator. Es bedeutet, dass zaehler eine Referenz ist. Was das ist, schlägst du am besten im Lehrbuch deiner Wahl nach. Es handelt sich um eine äußerst wichtige und nützliche Sache.

    Zur zweiten Frage:
    Ja, ptr ist ein Zeiger. Aber wenn man den Arrayzugriffsoperator[] darauf anwendet, dann wird er dereferenziert. Genau genommen wird aus ptr[i] folgendes gemacht: *(ptr+i) Und deshalb braucht man nicht mehr selbst zu dereferenzieren. Und diese kleine Umformung ist auch schon das große Geheimnis wie Arrays funktionieren.


Anmelden zum Antworten