Fehlermeldung bei Array



  • Hallo mal wieder 😉

    habe heute mit dem kapitel arrays begonnen, leider will das gar nicht so wie ich will 😞 "wie hätte es auch anders sein sollen?"

    folgenderweise schaut momentan mein code aus:

    #include <iostream>
    #include "Menue.h"
    
    using namespace std;
    
    char ZeigHauptMenue()
    {
    
    	char* aMenue[4]={"Kontoverwaltung: ", "Beenden" , "Anzeigen" ,     
                              "Abheben"};
    	char wahl='1';
    	cout<<"Bitte wählen Sie: "<<endl;
    	int a=0;
    	for(int i = 0; i<=a; i++)
    	{
    	  cout<<aMenue[a]<<endl;
    	  a++;
    	}
    	cin>>wahl;
    	return wahl;
    }
    

    jedesmal wenn ich compiliere kommt wärend der laufzeit ein fenster mit folgendem inhalt:

    Unbehandelte Ausnahme bei 0x1026f8e0 (msvcr90d.dll) in Bankautomat.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcccccccc.

    gehe ich nun in dem fenster auf weiter kommt der fehler immer wieder, wenn ich nun auf unterbrechen klicke finde ich mich in der strlen.asm unter dem punkt main_loop bei mov eax, dword ptr [ecx] ; read 4 bytes wieder.

    allerdings ist auch komisch das wenn ich nun meine von visual studio geöffnete eingabeaufforderung öffne alles so steht wie ich es mit meinem code beabsichtige.

    es tut mir leid, ich wusste nicht nach was ich googeln sollte!



  • Geh mal mit Stzift und Papier durch, was in deiner for-Schleife alles passiert.
    Du hast 2 Zählvariablen, a und i, welche in jeder Runde hochgezählt und dann verglichen werden (i<=a). Schau dir an, wie i und a vor und nach jedem Schleifendurchlauf ausschauen, und überleg dir ob das Ding überhaupt irgendwann ein Ende findet 😛


  • Mod

    int a=0;
        for(int i = 0; i<=a; i++)
        {
          cout<<aMenue[a]<<endl;
          a++;
        }
    

    Schau dir doch einmal an, was dies hier macht.

    - Zuerst setzt du a auf 0.
    - Dann wird i auf 0 gesetzt und geprüft, ob i<=a ist. Da 0<=0, ist die Antwort ja und das heißt, die Schleife wird ausgeführt:
    {
    - aMenue[0] wird ausgegeben
    - Dann wird a um 1 erhöht, a hat jetzt den Wert 1.
    }
    Die Schleife ist fertig und i wird um 1 erhöht. i hat nun den Wert 1.
    - Nun wird wieder geprüft, ob i<=a ist. Da 1<=1 , ist die Antwort ja und das heißt, die Schleife wird ausgeführt:
    {
    - aMenue[1] wird ausgegeben
    - Dann wird a um 1 erhöht, a hat jetzt den Wert 2.
    }
    Und so weiter und so weiter...

    Ich denke du verstehst nun den Fehler in deinem Algorithmus. Fazit: Nochmal for-Schleifen angucken.



  • samkirchner schrieb:

    Hallo mal wieder 😉

    #include <iostream>
    #include "Menue.h"
    using namespace std;
    
    char ZeigHauptMenue()
    {
    	
    	char* aMenue[4]={"Kontoverwaltung: ", "Beenden" , "Anzeigen" ,     
                              "Abheben"};
    	char wahl='1';
    	cout<<"Bitte wählen Sie: "<<endl;
    	int a=0;
    	for(int i = 0; i<=a; i++)
    	{
    	  cout<<aMenue[a]<<endl;
    	  a++;
    	}
    	cin>>wahl;
    	return wahl;
    }
    

    1. Also die for-Schleife sieht nach einer Endlosschleife aus.
    2. Dann sind in "" eingeschlossene Zeichen vom typ "const char*" und nicht "char*".

    Wenn du dies änderst sollte es eigentlich gehen.^^

    #include <iostream>
    using namespace std;
    
    char ZeigHauptMenue()
    {
        char wahl ='1';
        const int A = 4;
        const char* aMenue[A] = {"Kontoverwaltung: ","Beenden","Anzeigen" ,"Abheben"};
    
        cout << "Bitte waehlen Sie: " <<endl << endl;
        for(int i=0; i<A; i++)
        {
          cout << i+1 << ": " << aMenue[i] << endl;
        }
    
        cin >> wahl;
    
        return wahl;
    }
    
    int main()
    {
        ZeigHauptMenue();
        system("pause>nul");
        return 0;
    }
    


  • ok, danke nun geht es aber ich verstehe rein gar nichts, muss dazu erstmal mehr lesen wieso die arrays auch bei meiner anderen übung zicken machen, scheinbar habe ich da noch ne rießige bildungslücke, die dringendst gestopft werden muss.



  • 😋

    Vielleicht solltest du erst einmal mit einfacheren Arrays hantieren, und nicht gleich mit Zeiger-Arrays anfangen.

    so:

    char ar_menu[][18]={"Kontoverwaltung: ", "Beenden" , "Anzeigen" , "Abheben"};
    

    1. Das ist nun ein 2d char-Array.

    2. Die erste Dimension gibt an, welche Zeichenkette du ansprechen willst.

    3. Die zweite Dimension gibt an, welches Zeichen du in dieser Zeichenkette ansprechen willst. --> Darum steht bei der zweiten Dimension als Größe 18 weil die längste Zeichenkette 18 Zeichen (17 + 0-Terminierungszeichen)hat.

    4. Die Größe der 1. Dimension kann der Compiler selbst errechen, alle anderen Dimensionsgrößen musst du aber angeben.

    5. Die Dimensionsgröße MUSS zur Compiletime bekannt sein, d.h. die Größe muss konstant sein.

    PS.: Ich hatte vorhin geschriebn dass in "" eingschlossenen Zeichen vom Typ "const char*" sind.
    Bei char-Arrays ist das "xyz" allerdings nur eine Abhilfe für {'x','y','z'}


  • Mod

    @Dweb: Du willst doch wohl nicht ernsthaft behaupten, dass dein 2d char-Array einfacher wäre als das char*-Array des Threaderstellers. Mit char* ist man viel flexibler und man hat weniger Fallstricke bei der Benutzung und die Syntax ist einfacher.
    Und es war der Teil des Programm, den der Threadersteller anscheinend schon im Griff hat, zumindest war da alles richtig (bis auf fehlendes const).



  • SeppJ schrieb:

    @Dweb: Du willst doch wohl nicht ernsthaft behaupten, dass dein 2d char-Array einfacher wäre als das char*-Array des Threaderstellers. Mit char* ist man viel flexibler und man hat weniger Fallstricke bei der Benutzung und die Syntax ist einfacher.

    Also asls ich vor 3 Jahren mit C++ angefangen hab,
    kam ich mit 2d char-Arrays besser klar als mit zeiger-arrays.
    Lag vielleicht auch daran dass der Prof das Zeiger-Thema weit in der Vorlesung nach hinten geschoben hatte....
    wohl geschmackssache 😛


Anmelden zum Antworten