Bestimmte Textstellen



  • Das stimmt zwar, der eigentliche Fehler ist aber das ";" nach der for-Schleife. Damit ist die schon zuende bevor der eigentliche Block kommt. Und danach ist "Zahl" nicht mehr gültig. Also das Semikolon weglassen.



  • Christian211 schrieb:

    Solltest die Regel "Variablen werden am Eingang der Funktion deklariert" beherzigen.

    Aber eher nicht bei for-Schleifen. Die Zähl-Variable wird i.d.R. nur in der Schleife benötigt, es wäre deshalb Verschwendung, sie ausserhalb zu deklarieren.

    Dass das öfter mal in Code-Beispielen auftaucht liegt vor allem daran, dass Microsofts VC++ bis mindestens Version 6 zu doof war, sich diesbezüglich an den Standard zu halten.



  • Aber eher nicht bei for-Schleifen. Die Zähl-Variable wird i.d.R. nur in der Schleife benötigt, es wäre deshalb Verschwendung, sie ausserhalb zu deklarieren.

    Erlaube mir dazu eine andere Meinung zu haben. Variablen gehören nach "oben". Das trägt zur Lesbarkeit und Wartbarkeit des Codes ungemein bei, insbesondere, wenn mehrere daran arbeiten. Wenn 5 Leute jeweils an 5 Stellen Variablen deklarieren ist das auch Verschwendung. Wo sie auf dem Stack und wie lange liegen dürfte in der Praxis unerheblich sein.



  • for(int Zahl=0; Zahl<=Liste->Count; Zahl++)
     {
      if(Liste->Strings[Zahl]==Edit1->Text)
       {
        Label3->Caption=Edit1->Text;
       }
      else
       {
       Application->MessageBox("Your name is wrong", "error", 0);
       }
     }
    

    so hab ich es jetzt und es funktioniert. ich war so doof und hab ein ; dahinter gesetzt und es nicht bemerkt da hattet ihr recht ^^

    jetzt gibts ein neues problem: der sucht sich zwar die zeile raus, aber sagt dafür 9 mal das es falsch ist.
    Also in "Liste" (TStringList) stehen jetzt die zeilen:
    Zeile1
    Zeile2
    Zeile3
    Zeile4
    Zeile5
    Zeile6
    Zeile7
    Zeile8
    Zeile9
    Zeile10

    Wenn ich jetzt im Edit fenster z.b. "Zeile 3" eingebe, geht der alle Zeilen durch (soll er ja auch) aber dafür gibt er für Zeile1, Zeile2, Zeile4-10 falschmeldungen. Wee mache ich es das nur ne Fehlermeldung ausgegeben wird wenn in KEINER zeile das eingegebene steht?

    Danke CSP



  • bool found=false;
    for(int Zahl=0; Zahl<=Liste->Count; Zahl++)
     {
      if(Liste->Strings[Zahl]==Edit1->Text)
       {
        Label3->Caption=Edit1->Text;
        found=true;
    //ggf. könnte hier ein break rein, wenn die anderen nach einem Fund nicht durchsucht werden sollen
       }
     }
    if(!found)
      {
       Application->MessageBox("Your name is wrong", "error", 0);
       }
    


  • Christian211 schrieb:

    Erlaube mir dazu eine andere Meinung zu haben.

    Dito.

    Hier trifft im kleinen genau dasselbe zu wie für globale Variablen:
    Wenn eine Variable nur in einer Funktion (oder Schleife) benötigt wird, dann sollte sie auch nur in der Funktion (oder Schleife) gültig sein, d.h. dort deklariert werden.

    Ich bezweifle ausserdem, dass sowas zu Beginn einer Funktion irgendwie der Les- und Wartbarkeit hilft:

    int i, j, k, x, y, z; // Zähler für for-Schleifen
    // oder
    int i; // Zähler erste for-Schleife 
    int j; // Zähler zweite for-Schleife
    int k; // Zähler dritte for-Schleife
    int x; // Zähler Spalten-Schleife
    int y; // Zähler Zeilen-Schleife
    int z; // Zähler Items-Schleife
    


  • Man könnte eine Variable wiederverwenden... Du übertreibst etwas 😉



  • Christian211 schrieb:

    bool found=false;
    for(int Zahl=0; Zahl<=Liste->Count; Zahl++)
     {
      if(Liste->Strings[Zahl]==Edit1->Text)
       {
        Label3->Caption=Edit1->Text;
        found=true;
    //ggf. könnte hier ein break rein, wenn die anderen nach einem Fund nicht durchsucht werden sollen
       }
     }
    if(!found)
      {
       Application->MessageBox("Your name is wrong", "error", 0);
       }
    

    das hat mich schon mal weiter gebracht danke
    leider werden immernoch alle zeilen BIS ZUR richtigen Zeile mit einer MsgBox als "Falsch" benannt. Er soll aber nur sagen das nichts gefunden wurde (Your name is wrong) wenn es in der ganzen datei nichts gibt
    das ist nervig vor allem wenn man mehrere hundert zeilen hat und das gefundene sagen wir in 246 ist 😮
    Ich glaube das wäre dann das letzte problem ⚠ 😋 😕 :p



  • Das kann nicht sein. In der Schleife wir keine Messagebox mehr ausgegeben. Die wird DANACH ausgegeben. Schau nochmal hin!



  • Christian211 schrieb:

    Das kann nicht sein. In der Schleife wir keine Messagebox mehr ausgegeben. Die wird DANACH ausgegeben. Schau nochmal hin!

    Yo hatte es falsch geändert es funzt alles sehr gut danke an alle anmtworten besonders an Christian211



  • Christian211 schrieb:

    Du übertreibst etwas 😉

    Die C++-Entwickler haben sich sicher etwas dabei gedacht, als sie die Deklaration im Schleifenkopf erlaubt haben. 😉
    Wiederverwendung ist natürlich möglich, birgt aber Fehlerpotential (fehlende Neuinitialisierung).



  • Ohhhhh 😛

    for(int Zahl=0; Zahl<=Liste->Count; Zahl++)
      {
      if((Liste->Strings[Zahl]==Edit1->Text)&&(Liste->Strings[Zahl+1]==Edit2->Text));
       {
       Form1->Button1->Enabled=false;
       Form1->Button2->Enabled=true;
       Form1->Button4->Enabled=true;
       gefunden=true;
       Form2->Close();
       break;
       }
      }
     if(!gefunden)
      {
      Application->MessageBox("Your name or/and password is wrong", "error", 0);
      }
    

    Was is jetzt daran falsch? Das problem ist: EGAL ob was gefundne wird oder nicht, er führt die erste if methode aus und lässt die 2. unbeachtet. Also auch wenn nichts gefunden wird wird die erste if methode benutzt

    thx



  • Hast du gefunden vorher mit false initialisiert?
    Bei deiner Abfrage gehst du zu Schluß über die Arraygrenzen hinaus.

    for(int Zahl=0; Zahl<=Liste->Count; Zahl++) // geht von 0 bis Count, Liste geht aber nur von 0 bis Count-1
      {
    // hier testest du bei Zahl=Count sogar mit Count+1
      if((Liste->Strings[Zahl]==Edit1->Text)&&(Liste->Strings[Zahl+1]==Edit2->Text));
    

    richtiger wäre

    for(int Zahl=0; Zahl<Liste->Count-1; Zahl++)
      {
      if((Liste->Strings[Zahl]==Edit1->Text)&&(Liste->Strings[Zahl+1]==Edit2->Text));
    


  • Braunstein schrieb:

    Hast du gefunden vorher mit false initialisiert?
    Bei deiner Abfrage gehst du zu Schluß über die Arraygrenzen hinaus.

    for(int Zahl=0; Zahl<=Liste->Count; Zahl++) // geht von 0 bis Count, Liste geht aber nur von 0 bis Count-1
      {
    // hier testest du bei Zahl=Count sogar mit Count+1
      if((Liste->Strings[Zahl]==Edit1->Text)&&(Liste->Strings[Zahl+1]==Edit2->Text));
    

    richtiger wäre

    for(int Zahl=0; Zahl<Liste->Count-1; Zahl++)
      {
      if((Liste->Strings[Zahl]==Edit1->Text)&&(Liste->Strings[Zahl+1]==Edit2->Text));
    

    Problem besteht weiterhin! Hat nicht geholfen trotz beider verbesserungen



  • Steht irgendwo vorher geschrieben ?

    gefunden=false;
    

    Falls nein, dann ist das ein Fehler (siehe sundays Post).

    Da war ein "=" zuviel, jetzt nicht mehr. 🕶



  • @CounterstrikePlayer
    Geh doch bitte mal mit dem Debugger durch und schau was dein Code macht.



  • caspar_louis schrieb:

    Steht irgendwo vorher geschrieben ?

    gefunden=false;
    

    Falls nein, dann ist das ein Fehler (siehe sundays Post).

    Da war ein "=" zuviel, jetzt nicht mehr. 🕶

    ja hab ich bei mir stehen

    Braunstein schrieb:

    @CounterstrikePlayer
    Geh doch bitte mal mit dem Debugger durch und schau was dein Code macht.

    wie ist das gemeint? Sorry Größter Noob aller Zeiten am werke



  • Hallo

    Braunstein meint, du sollst den Debugger benutzen.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Braunstein meint, du sollst den Debugger benutzen.

    bis bald
    akari

    hab ich aber das hilft mir auch nicht
    sobald der bei der ersten if-methode ankommt, setzt er gefunden auf true egal ob es wirklich so sein soll oda nich



  • Och nööö. Und ich dachte, du hättest inzwischen dazugelernt. Auch nach If-Abfragen gehört kein Semikolon... Sonst kommt dasselbe raus wie bei deiner Schleife am Anfang...


Anmelden zum Antworten