Array



  • Hallo an alle!

    Ich habe gerade mit C++ angefangen und bin bei den Arrays. Es funktioniert alles tadellos, nur er gibt mir die Zahlen die in den Array geschrieben werden nicht aus.

    Hier mal der Quelltext:

    #include <iostream.h>
    #include <conio.h>
    
    const long ANZELEM=8;
    class CArray{
                 private:
                         int Zahlenfeld[ANZELEM];
                         void initialisieren();
                 public:
                         CArray();
                         void eingeben();
                         void ausgeben();
    };
    
    CArray::CArray()
    {
                 initialisieren();
    }
    
    void CArray::initialisieren()
    {
         for (long i=0;i<ANZELEM;i++)
         {
             Zahlenfeld[i]=0;
         }
    }
    void CArray::eingeben()
    {
         int Eingabe=0;
         cout << "Bitte geben Sie Ganzzahlen ein, sonst erfolgt Abbruch!" << endl;
         for (long i=0;i<ANZELEM;i++)
         {
             cout <<i<<". Element: ";cin>>Eingabe;
             if(Eingabe=0){break;}
             else{Zahlenfeld[i]=Eingabe;}
         }
    }
    void CArray::ausgeben()
    {
         cout << "Ausgabe der Elemente!" << endl;
         for (long i=0;i<ANZELEM;i++)
         {
             cout <<i<<". Element: "<<Zahlenfeld[i]<< endl;
         }
    }
    int main()
    {
        char wiederholen;
        do
        {
        system("CLS");
        CArray Objekt;
        Objekt.eingeben();
        Objekt.ausgeben();
        cout << "\nWiederholen? J/N";cin>>wiederholen;
        }
        while (wiederholen='n');
        return 0;
    }
    

    Kann mir jemand weiterhelfen?!

    Mfg -- fuwangschu



  • Ich denke der Fehler liegt in der Einlese-Routine.
    Du glaubst, daß er bei Eingabe von "0" das Einlesen abbrechen sollte und dann die Werte ausgeben soll ... tut er aber nicht.

    So wäre es richtig:

    if(Eingabe==0){break;} // Abfrage auf Gleichheit mit == !!!
    

    Dies ist ein berühmter Anfängerfehler in C bzw. C++.

    P.S. Denselben Fehler hast du noch an anderer Stelle...



  • jop stimmt ahst du

    und zwar in der while bedingung

    if ( Eingabe = 0 )
    

    heisst auf gut deutsch:

    der setzt eingabe auf 0
    und weil das nicht schief gehen kann ist das wahr

    dadurch kommen entlosschleifen zsutande und falsche eingaben (wie bei dir)

    naja und wenn ich das richtig verstehe soll der die haupt while schleife immer wiederholen wenn man auf die frage "wiederholen?" mit j antwortet
    aber deine bedingung steht fürs gegenteil

    ausserdem:

    do
        {
        //system("CLS");
        CArray Objekt;  // <--- nie eine variable in einer schleife deklarieren
        //Objekt.eingeben();
        //Objekt.ausgeben();
        //cout << "\nWiederholen? J/N";cin>>wiederholen;
        }
        while (wiederholen='n');
    

    nicht machen weil es ziemlich auf die geschwindigkeit drückt
    machd as ganze lieber mit zeigern...

    CArray *Objekt;
    
    do {
        Objekt = new Objekt;
        Objekt->eingeben();
        Objekt->ausgeben();
        cout<<"dingenskirchen;
        cin >> wiederholen;
        delete Objekt;
        Objekt = NULL;
    } while ( wiederholen == 'j' )
    


  • do
    {
        CArray Objekt;
        ...
    }
    while (...);
    
    CArray *Objekt = 0;
    do 
    {
        Objekt = new CArray;
        ...
        delete Objekt;
        Objekt = 0;
    } while (...);
    

    Diese beiden Varianten machen geschwindigkeitsmäßig gar keinen Unterschied, weil bei beiden in jedem Schleifendurchlauf ein neues Objekt erzeugt wird. Die erste Variante ist in C++ immer zu bevorzugen, weil man bei dynamischer Speicherverwaltung gerne mal ein delete vergisst.
    Merke: Wo möglich immer die Objekte auf dem Stack anlegen und wenn man unbedingt mal einen Zeiger braucht, dann verwendet man Smartpointer, die nehmen einem das delete ab.
    Wenn man hier irgendwas "optimieren" will, dann muss man das Objekt außerhalb der Schleife anlegen und wenn nötig in jedem Schleifendurchlauf einige Werte des Objekts auf den Grundzustand zurücksetzen.



  • wobei eigendlich ist das hier ja auch egal

    weil der flaschenhals in jedem fall der user mit seiner eingabe sein wird...



  • Skym0sh0 schrieb:

    if ( Eingabe = 0 )
    

    [...]
    und weil das nicht schief gehen kann ist das wahr

    Falsch.

    (Eingabe = 0) hat den Wert 0. Und bei if (0) wird der Body nun einmal nicht ausgeführt. Eine Zuweisung liefert eine Referenz des LValues.


Anmelden zum Antworten