"a" was not declared in this scope



  • Hallo,
    Ich hab einen Bankautomaten simuliert, der bei dem Teil versagt, der statt
    Zeichen nur "**" anzeigen soll.
    Da steht eine einzige ziemlich simple Fehlermeldung die besagt, das a hier nicht deklariert worden ist, was meiner Meinung nach nicht stimmen kann - seht selbst:

    #include <iostream>
    #include <conio.h>
    using namespace std;
    int main()
    {
    char Account[8],Passwort[8];
    
    cerr ;"Guten Tag!\nHerzlich Willkommen in der XX Bank.\n";
    
    do
    {
    cerr <<"Account:\n";
    cin >> Account;
    
    if(strcmp(Account,"cstar")!=0)
    cerr <<"Account existiert nicht. Wiederholen Sie die Eingabe.";
    }
    while ( strcmp(Account,"cstar")!=0);
    int i=0;
    do
    {
    cerr <<"Passwort:\n";
    do
    {                         
    char a =getch();   //Hier wird a deklariert und initialisiert
    cerr <<"*";               
    } 
    while(strcmp(a,"\n")!=0);//Hier wird die Fehlermeldung angezeigt
    
    if(strcmp(a,"2932")!=0)
    {
    cerr<<"Passwort ist falsch.\n";
    i++;
    if (i==3)
    {cerr<<"Account gesperrt.";return 0;}
    if (i==2)
    {cerr<<"Noch\n"<<3-i<<"\nVersuch m\224glich.\n";
    continue;}
    else
    {cerr<<"Noch\n"<<3-i<<"\nVersuche m\224glich.\n";
    continue;
    }
    }}
    while (strcmp(Passwort,"2932")!=0);
    
    cerr <<"herzlich willkommen, Sie haben sich eingeloggt!";
    
    return 0;
    }
    

    Vielen Dank im Voraus, und bitte nicht bei dem Programm an sich beschweren DAS ist noch lange nicht fertig 😉


  • Mod

    Variablen leben nur so lange wie die geschweiften Klammern, zwischen denen sie stehen.

    Dein Programm sieht auf den ersten Blick übrigens schrecklich aus, ich bezweifle dass das funktioniert. Aber ohne vernünftige Einrückung sehe ich mir das nicht näher an.



  • Die geschweiften Klammern definieren in C++ einen eigenen Gültigkeitsbereich (aka "Scope"). Deshalb ist die Variable an der Stelle, wo du sie verwendest, nicht mehr gültig.

    do
    {
      char a =getch();         //Hier wird a deklariert und initialisiert
      cerr <<"*";               
    }                          //Hier endet der Gültigkeitsbereich von a
    while(strcmp(a,"\n")!=0);  //Hier wird auf a zugegriffen
    

    Außerdem benötigst du kein strcomp(), um einzelne Zeichen miteinander vergleichen zu können - und du solltest die Eingaben irgendwo zwischenspeichern:

    string pwd;
    char a
    do
    {
      a = getch();
      if(a!='\n') pwd+=a;
      cerr << '*';
    }
    while(a != '\n');
    
    if(pwd == "12345")
      ...
    


  • ahh ja danke das mit dem gültigkeitsbereich hab ich ganz vergessen



  • Hacker schrieb:

    cerr ;"Guten Tag!\nHerzlich Willkommen in der XX Bank.\n";
    

    Was ist das?



  • EOutOfResources schrieb:

    Hacker schrieb:

    cerr ;"Guten Tag!\nHerzlich Willkommen in der XX Bank.\n";
    

    Was ist das?

    Vollkommen legaler (wenn auch sinnloser) C++-Code 😃

    Da stellt sich übrigens die Frage, ob es einen tieferen Sinn hat, alle Ausgaben nach cerr zu schicken. cerr ist der Kanal für Fehlerausgaben, die reguläre Ausgabe des Programms sollte an cout geschickt werden.



  • CStoll schrieb:

    cerr ist der Kanal für Fehlerausgaben, die reguläre Ausgabe des Programms sollte an cout geschickt werden.

    Wieso nicht gleich an std::clog ?



  • EOutOfResources schrieb:

    CStoll schrieb:

    cerr ist der Kanal für Fehlerausgaben, die reguläre Ausgabe des Programms sollte an cout geschickt werden.

    Wieso nicht gleich an std::clog ?

    cerr und clog werden beide auf stderr gemappt, nur mit unterschiedlichen Caching-Strategien. Außerdem sollte doch der Name schon einen Hinweis darauf geben, wofür die Standard-Streams verwendet werden 😃



  • CStoll schrieb:

    Außerdem sollte doch der Name schon einen Hinweis darauf geben, wofür die Standard-Streams verwendet werden 😃

    std::c out
    std::c in
    Hm... 😃


Anmelden zum Antworten