Hmm finde den Fehler einfach nicht



  • Hallo

    entweder liegt es daran das es noch viel zu früh ist, oder ich habe gerade total die Übersicht verloren. Ich möchte gerne einen kleinen LoginDialog zu meinem Programm hinzufügen momentan noch mit festen Daten, später mit ner Datenbank.
    In meiner Login Class (die von CDialog abgeleitet wird) habe ich die Methode int ueberpruefung(bool ergebnis); deklariert.

    Meine cpp dazu sieht folgendermaßen aus:

    [cpp]int Login::ueberpruefung(bool ergebnis)
    {
    	CString Benutzername = "Sebastian Dors";
    	CString Passwort = "shuttle";
    
    	if(m_Benutzername == Benutzername && m_Passwort == Passwort)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    
    }
    [/cpp]
    

    alles gut und schön, nur wenn ich jetzt in mein mainfrm gehe und dort das ergebnis der Prüfung abfragen will erhalte ich drei Fehlermeldungen die mich gerade erwas dum aussehen lassen.

    MainFrm:

    [cpp]int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	for (int i = 0 ; i < 2 ; i++)
    	{
    
    	bool pruefung = Kontrolle.ueberpruefung(bool ergebnis);
    
    		if(pruefung == true)
    		{
    			break;
    		}
    		else
    		{
    			MessageBox("Sie haben einen falschen Benutzernamen oder ein falsches Passwort eingegeben","Fehler",MB_OK | MB_ICONEXCLAMATION);
    
    			i = 0;
    		}
    	}[/cpp]
    

    Die Fehlermeldunge lauten:

    C:\Dokumente und Einstellungen\Dors\Desktop\C++\SDI\MainFrm.cpp(55) : error C2275: "bool" : Ungültige Verwendung dieses Typs als  Ausdruck
            c:\dokumente und einstellungen\dors\desktop\c++\sdi\stdafx.cpp(0) : Siehe Deklaration von 'bool'
    C:\Dokumente und Einstellungen\Dors\Desktop\C++\SDI\MainFrm.cpp(55) : error C2146: Syntaxfehler : Fehlendes ')' vor Bezeichner 'ergebnis'
    C:\Dokumente und Einstellungen\Dors\Desktop\C++\SDI\MainFrm.cpp(55) : error C2059: Syntaxfehler : ')'
    

    Hoffe mir kann am frühen morgen jemand helfen.

    P.S. Es handelt sich um eine SDI Anwendung (falls diese information jemand braucht)

    Gruß Silver



  • Richte deine Aufmerksamkeit mal auf diese Zeile, besonders auf das Wort bool. 😃

    bool pruefung = Kontrolle.ueberpruefung(bool ergebnis);
    

    Da is eines zu viel. 😉



  • Aber ich muss doch das ergebnis in eine andere Variable abspeichern oder nicht?
    Kann ich mit bool ergebnis weiter machen??
    Brauche ich nicht noch ein bool (hier pruefung) wo ich den Wert rein kopiere??



  • wenn man eine Funktion/Methode aufruft, übergibts man nur die Variable und legt nicht nochmal den Typ dabei fest.

    Was du willst ist wohl folgendes

    bool Login::ueberpruefung()
    {
        CString Benutzername = "Sebastian Dors";
        CString Passwort = "shuttle";
    
        if(m_Benutzername == Benutzername && m_Passwort == Passwort)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    //in deiner Schleife dann das;
    bool pruefung = Kontrolle.ueberpruefung();
    


  • Silvercreast schrieb:

    Aber ich muss doch das ergebnis in eine andere Variable abspeichern oder nicht?

    Muss? Weiß ich nicht, kommt drauf an... aber du kannst.

    Kann ich mit bool ergebnis weiter machen??

    Das ist ja gerade deine Fehlerquelle. Deklariere die Variable einfach vor dem Aufruf, auch wenn ich den Sinn nicht sehe...

    Brauche ich nicht noch ein bool (hier pruefung) wo ich den Wert rein kopiere??

    s.o.

    Da ich den Code nochmal genauer angeguckt habe... sei nicht böse, aber hol dir erstmal nen Kaffee. 😉
    Du hast eine Funktion, die int zurückgibt und macht da drin

    return true;
    

    😕
    Du scheinst da einen Rückgabeparameter hinzudenken, nutzt ihn aber nicht und eine Referenz ist er auch nicht. 😕

    Und so wie die if aussieht, die würde ich auch umstellen, sieht danach übersichtlicher aus - leider weiß ich nicht, wie es danach weitergeht und ob sich das verträgt. 🙄

    Edit, ich machs einfach mal:

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        for (int i = 0 ; i < 2 ; i++)
        {
            if(!Kontrolle.ueberpruefung())
            {
                MessageBox("Sie haben einen falschen Benutzernamen oder ein falsches Passwort eingegeben","Fehler",MB_OK | MB_ICONEXCLAMATION);
    
                i = 0;
            }
        }
    

    Aber wieso wird das mehrfach geprüft? 😕
    Naja, du wirst dir schon was dabei gedacht haben. 🙂



  • Also erstmal bin ich nicht sauer wenn mir Fehler erklärt werden dadurch lerne ich doch nur selbst.
    Zum zweiten der Login soll sich wiederholen wenn das Passwort oder der B.name falsch sind. Das heisst es geht immer wieder ein Login auf bis das richtige eingegeben wurde. Oder hast du dafür auch noch eine bessere Lösung?



  • Wieso machst du keine while?

    while (!Kontrolle.ueberpruefung())
            {
                MessageBox("Sie haben einen falschen Benutzernamen oder ein falsches Passwort eingegeben","Fehler",MB_OK | MB_ICONEXCLAMATION);
            }
    

    Klein und übersichtlich. 😉

    Wobei ich dir als User vermutlich den Hals umdrehen würde, wenn ich meine Versuche nicht aufgeben kann. 😉
    Ich vermisse hier eine Abbruchmöglichkeit.



  • Ehrlich gesagt habe ich an ne while gar nicht gedacht 🙄
    Wieso würdest du mir den Hals umdrehen ich kann doch froh sein das mir jemand hilft und wieso sollte ich dann nicht auch Verbesserungen annehmen. Gerade von dir du hast mir schon so oft geholfen, dass ich glaube wenn du mir was Vvrschlägst das das dann auch wirklich besser ist 😃



  • Achso noch zur Abbruchmöglichkeit momentan ist das alles noch zur Übung , bald soll das ne richtige Server Client Anwendung werden. Wenn du dich zurück einnerst mit Drucken und ODBC das war alle nur Übung für dieses Programm was bald anfängt.
    Und wie das Programm und wo das Programm laufen soll ist noch nicht geklärt wenn es auf einem separaten Rechner laufen soll, dann wird das Programm immer laufen da brauch ich das dann nicht. Nur wenn das auf jeden Rechner soll dann schon.



  • Hey, allwissend bin ich auch nicht. 😉

    Was ich eben meinte ist folgende Situation:
    Du bist mal der Benutzer von deinem Programm:
    Du startest das und wirst zum Anmelden aufgefordert.
    Du gibst deine Daten ein ... falsch.
    Du versuchst es nochmal ... falsch.
    Hmm, keine Lust mehr - aber wie kommst du aus der Anmeldung wieder raus, wo deine Daten doch nicht passen und du dich nicht anmelden kannst? 😕



  • Ahso, nagut.
    Falls es mal nicht mehr Übung ist: Ein Dialog macht sich da praktisch, weil du in der OnOK die Daten prüfen kannst und nur, wenn die Okay sind auch CDialog::OnOK aufrufst.
    Abbrechen geht dann mit dem Abbrechen-Knopf und die aufrufende Funktion kann den Rückgabewert von DoModal nutzen.

    if (IDOK == dialog.DoModal())
    {
    // Daten waren okay
    }
    

    ..das war die Kurzfassung. 😉



  • Kurz und knackig 😃



  • Ich habe was gemerkt ganz am anfang und ich denke ist nicht korrekt

    Silvercreast schrieb:

    int Login::ueberpruefung(bool ergebnis) 
    { 
        CString Benutzername = "Sebastian Dors"; 
        CString Passwort = "shuttle"; 
    
        if(m_Benutzername == Benutzername && m_Passwort == Passwort) 
        { 
            return true; 
        } 
        else 
        { 
            return false; 
        } 
    
    }
    

    hier dir funktion von type int und sie übergibt false und true zurück.
    soll nicht von type Bool sein? geht int mit flase, true zusammen?



  • guter einwand 🙂 . Ich versteh deine zweite Frage aber nicht.
    Momentan habe ich das Problem das immer eine Entlosschleife entsteht, da er mir den Login Dialog nicht aufrufen will was muss ich dazu machen damit der mir den Dialog aufruft??



  • Zeig mal den Code.



  • Welchen ?? Der mit der If ist genauso übernommen wie du Ihn mir gegeben hast



  • Du müsstest irgendwo zwischen den einzelnen Überprüfungen auch zurückgehen zur Eingabe, sonst testest du immer die selben (falschen) Einträge für Name und Passwort.



  • für solche dialog fragen tue ich immer so.
    im hauptdilaog einen knopf einfügen .bei tasten diesen knopf hole ich die eingaben über die passwort mit UpdatData(TRUE).
    im knopffunktion überprüfe ich die angaben wenn korrekt lasse ich mein programm weiter arbeiten. wenn nicht ...tue nicht ....meldung ..angabe falsch und bin noch in mein hauptdialog ..kann auch schliessen mit cancel.



  • also hier brauche ich keine schleife



  • CStoll schrieb:

    Du müsstest irgendwo zwischen den einzelnen Überprüfungen auch zurückgehen zur Eingabe, sonst testest du immer die selben (falschen) Einträge für Name und Passwort.

    Stimmt, wo ist die überhaupt? 😕


Anmelden zum Antworten