for-schleife und if/else == chaos?



  • das komische ist ja wenn ich von dem code was ich jetzt gepostet habe, die letzte else anweisung weg lasse, also:

    else
            {
                Client->CloseRequest = true;
                break;
            }
    

    dann funktioniert die schleife wie ich mir das programmiertechnisch vorstelle. blos kann ich jetzt anonyme benutzer nicht kicken, da ja die else anweisung fehlt 😉 die ja ausgeführt werden soll wenn die erste if-anweisung nicht stimmt. blöd ist das jap. das kanns doch echt nicht sein. ist die else anweisung weg, tut der code wie er soll. die else anweisung muss aber sein. 🙂



  • Wie gesagt, wahrscheinlich irgendwo ein Denkfehler.
    Mir passiert ja sowas nie im Leben 🙄, deswegen kann ich ja auch mit dem Debugger nicht umgehen :D:D:D

    [ Dieser Beitrag wurde am 25.04.2003 um 15:32 Uhr von Peter editiert. ]



  • naja ich frage mich blos wo da der denkfehler sein sollte. für mich sieht der code sehr ok aus. was meinst du? findest nicht auch? :p *verzweifel* ...



  • 🙂 Ich hab hier ne PL/SQL Routine am Wickel, eigentlich sieht die auch ganz OK aus, aber sie looped leider endlos 😞



  • die "for"-Schleife macht in deinem Code wenig Sinn: bereits im 1. Durchlauf gibt es für jede mögliche Konstellation ein "break" => die "for"-Schleife wird verlassen!



  • also. ich habe jetzt mal den debugger angeschmissen. am anfang der for-schleife und am ende, einen BP gesetzt. sobald ich nun mit dem ftp client connecte, meldet sich der debugger, da an dieser BP stelle ja dergleichen wird ob user ok und so.

    also, der code ist so wie beim ersten posting.
    ich lande als erstes an der zeile (logisch was sonst)

    if(Users->IndexOf(Client->UserName) == x && PassWD->IndexOf(Client->PassWord) == x)
    

    da der benutze benutzername und passwrt beim client OK ist, müsste nun theoretisch die zweite if-anweisung kommen. aber was passiert? naa? genau! die zweite stelle an der ich lande ist unten bei der else anweisung:

    Client->CloseRequest = true;

    das kann vollkommen nicht sein! mache ich das ganze debugger spiel nun genau gleich, blos ohne die letzte else anweisung, lande ich wo? genau! an der eigentlich richtigen stelle, der zweiten if anweisung nähmlich. so, nun soll mir das mal einer erklähren :=))



  • Was hab ich gesagt ? Routine Schritt für Schritt durchgehen und ein wenig hirnen. Nicht alles vorkauen, <dattel> soll selber drauf kommen 😉



  • codewalker ich verstehe dich nicht ganz.

    1. was ist an der for-schleife denn nicht gut? :=))
    2. wird doch erst wenn die bedingung der if-anweisung:
    "if(Client->UserName == "Admin" && Client->PassWord == "6578")"
    erfüllt ist, der erste break gemacht. es kommt ja aber garnicht mal soweit.

    kurze erklährung der schleife:

    in der ersten if-anweisung wird überprüft ob der empfangene benutzername und passwort mit dem der TStringList übereinstimmt.

    falls ja, also ein berechtigter benutzer, dann wid noch kurz überprüft ob es evlentuell der admin ist. falls ja kommt er in das administrations directory (AHome), falls es doch kein admin war, kommt er (else) in das standard directory (Home)

    falls nun aber bei der ersten überprüfung garkeine übereinstimmung stattfindet, soll die letzte else anweisung ausgeführt werden und den benutzer disconnecten da er keinen zugriff hat.



  • für jeden Fall, der eintreten kann, gibt es ein "break". Somit wird die Schleife _beendet_. Vermutlich verwechselst du "break" mit "continue".

    "break" beendet nicht einen SchleifenDURCHGANG, sondern die ganze Schleife !

    [ Dieser Beitrag wurde am 25.04.2003 um 16:24 Uhr von CodeWalker editiert. ]



  • Original erstellt von <dattel>:
    da der benutze benutzername und passwrt beim client OK ist

    Offensichtlich sind Benutzername und Passwort eben nicht OK. Um das einfacher überprüfen zu können solltest du zum Debuggen die Ergebnisse der IndexOf-Abfragen in separaten Variablen speichern und diese dann mit x vergleichen.



  • codewalker:
    ""break" beendet nicht einen SchleifenDURCHGANG, sondern die ganze Schleife !"

    ja ich weis doch. das will ich doch auch. was bringt es mir wenn die schleife weiter überprüft, wenn bereits eine identifikation stattgefunden hat? deshald die breaks.

    Jansen:
    "Offensichtlich sind Benutzername und Passwort eben nicht OK"
    eben doch. schau, wie bereits gesagt, wenn ich die letzte else anweisung weglasse, klappt ja die erste if-anweisung. also muss benutzername und passwort OK sein 😕 🙄



  • Hi,
    überlege mal was du machen willst?
    Du willst überprüfen ob UserName und Passwort zusammengehören (in der selben Zeile von Listen stehen) - richtig? Wenn ja, wie macht man das denn am besten?

    1. Jedes Element der Liste durchgehen und überprüfen ob Passwort und UserName an dieser Stelle stehen?

    2. Jedes Element der Liste durchgehen, einzeln in eine Datei schreiben und dann die Dateien binär vergleichen?

    3. oder doch anders?

    Na mal ein wenig überlegen!

    MFG

    Alexander Sulfrian

    [ Dieser Beitrag wurde am 25.04.2003 um 17:12 Uhr von Alexander Sulfrian editiert. ]



  • hallo,

    ich denke das es an der klammerung der if liegt. es ist leider nicht möglich den code zu testen, aber wenn du sicher bis, das das if true ergibt, und er dennoch in den else-teil geht, dann stimmt mit der if was nicht. ich würde mal an der klammerung ansetzen:

    if((Users->IndexOf(Client->UserName) == x) && (PassWD->IndexOf(Client->PassWord) == x))

    versuchs mal so, und lass dir wie j gesagt hat beim debuggen die werte ausgeben. aber ich denke das bei dieser klammerung das ding funktioniert, sofern das if wirklich true ergibt...

    mfg
    murph



  • hallo.

    ich habe den fehler gefunden kann ihn aber nicht lösen 😃 :p
    habe ihn nicht durch variablen anzeige gefunden sondern mir ist grad ins auge gesprungen das.. also:

    wieso nun verflixt gleich zu der letzten else anweisung gesprungen wird ist mir jetzt klar. zwar ist der benutzername und das passwort das vom client gesendet wurde, korrekt und diese beiden sind auch korrekt in TStringList (Users und PassWD) vorhanden DOCH es wird falsch überprüft bzw. einmalig abgefragt und wenn an der x position BN und PS nicht übereinstimmen, ääätsch: else! es müsste so sein das bevor else unten kommt, erst die ganze StringList gecheckt wird, anstatt nur grad die einte position. das ist das problem. wie lös ich das jetzt?



  • das meine ich doch 😉 noch mal: "break" beendet nicht einen ScheifenDURCHLAUF, sondern die gesamte Schleife ! Die Programmausführung geht NACH der Schleife weiter ! Die Schleife ist, so wie du sie programmiert hast, völlig sinnlos.



  • wie muss ich die schleife den nun richtig "aufbauen" ? hab keinen schimmer wie ich es sonst machen soll als ich es bis jetzt gemacht habe... 🙄



  • Schade, dass ich mich als Moderator zurückhalten muss und nicht frei heraus meine Meinung über die Auffassungsgabe einiger Besucher hier sagen darf ...

    Und nein, damit meine ich nicht CodeWalker. 😉

    Pseudocode:

    Index von Benutzername in Liste1 ermitteln;
    if (not Benutzer in Liste1)   
      Abbruch;
    else 
    {
      if(Liste2[Index] == Passwort)
      {
        if (Benutzer == Admin)
          Adminpfad;
        else
          Benutzerpfad;
      }
      else
        Abbruch;
    }
    


  • entweder die "break" durch "continue" ersetzen, ganz weglassen oder das letzte "break" weglassen.
    "break" setzt du da, wo ein weiteres Durchlaufen einer Schleife sinnlos wird, weil das gewünschte Ergebnis schon gefunden ist. In diesem Fall also dort, wo Loginname und Paßwort gefunden wurden.

    [ Dieser Beitrag wurde am 25.04.2003 um 18:26 Uhr von CodeWalker editiert. ]



  • so?

    for(int x = 0; x < 5; x++)
        {
    
            if(Users->IndexOf(Client->UserName) < 0)
            {
                Client->CloseRequest = true;
                break;
            }
            else
            {
                if(Users->Strings[x] == Client->UserName && PassWD->Strings[x] == Client->PassWord)
                {
                    if(Client->UserName ==  "Admin" && Client->PassWord == "3343")
                    {
                        Client->HomeDir = AHome;
                    }
                    else
                    {
                        Client->HomeDir = Home;
                    }
                }
                else
                {
                    break;
                }
            }
        }
    

    ich krieg es nicht hin. verdammt nochmals 🙄 😞



  • hier noch mal dein 1. Code:

    for(int x = 0; x < 5; x++)
        {
            if(Users->IndexOf(Client->UserName) == x && PassWD->IndexOf(Client->PassWord) == x)
            {
                if(Client->UserName == "Admin" && Client->PassWord == "6578")
                {
                    Client->HomeDir = AHome;
                    break; // <= hier sinnvoll, wenn in der Schleife sonst nichts mehr verarbeitet werden soll
                }
                else
                {
                    Client->HomeDir = Home;
                    break; // dito
                }
            }
            else
            {
                Client->CloseRequest = true;
    //          break; // <= hier kein break, höchstens "continue", da Schleife weiterlaufen muß
            }
        }
    

    [ Dieser Beitrag wurde am 25.04.2003 um 19:04 Uhr von CodeWalker editiert. ]


Anmelden zum Antworten