Vergleich mit <>

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Vergleich mit <>

Beitrag von Jan »

Was mache ich hier falsch?

Code: Alles auswählen

FUNCTION chkNeuPass(cId, cPw, cNeuPw1, cNeuPw2)
LOCAL nId, nPw, nPwNeu

nId := CRYPT1(Alltrim(cId))
nPw := CRYPT2(cPw)

IF cNeuPw1 <> cNeuPw2
   meldung("Die beiden Kennwörter stimmen nicht überein"))
 ELSE
   nPwNeu := CRYPT2(cNeuPw1)
ENDIF
Im Debugger sehe ich z. B., daß cNeuPw1 = "h " ist und cNeuPw2 = "". Also definitiv ungleich. Aber der Code springt immer in die Zeile nach dem ELSE, als wenn das <> nicht gilt.

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
typischer Fehler, auf den bestimmt alle schon mal reingefallen sind! :D
Es wird der rechte mit dem linken Wert verglichen (also nicht cNeuPw1 mit cNeuPw2, sondern cNeuPw2 mit cNeuPw1) - und die Länge des rechten Wertes ist entscheidend! Es werden nämlich nur so viele Zeichen verglichen, wie der rechte Wert lang ist!!
Also:
Bla <> Bl -> .f.
Blu <> Blubb -> .t.
Am besten machst Du folgendes:

Code: Alles auswählen

IF .not. ( cNeuPw1 == cNeuPw2 )
oder in Deinem Fall (übersichtlicher):

Code: Alles auswählen

IF cNeuPw1 == cNeuPw2 
   nPwNeu := CRYPT2(cNeuPw1) 
 ELSE 
   meldung("Die beiden Kennwörter stimmen nicht überein")) 
ENDIF
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Martin,

I break together.

Jawoll, das war der Fehler. Ich war schon am Zweifeln an mir gewesen ob ich den Operator falsch im Kopf hatte, hab schon != etc. versucht. Was natürlich ebenfalls nichts geholfen hat.

Ich habe das jetzt nach Deinem Beispiel umgestrickt mit ==, und siehe da, es funktioniert.

Wobei ich gestehen muß, daß ich das Problem vorher noch nie hatte, erst in diesem Modul. War das unter Clipper genauso? Denn eigentlich habe ich den Code aus der alten Clipper-Version übernommen.

Danke.

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
ob das unter Clipper genau so war, kann ich Dir leider nicht hundertprozentig sagen, aber ich glaube: nicht.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Martin,

was du da sagst überrascht mich auch, unter Clipper - und da bin ich mir ziemlich sicher - war dieses Verhalten nur beim normalen = Vergleich, aber nicht bei <> oder # .

Man lernt nie aus.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

es lies mir keine Ruhe, daher testete ich folgenden Code mit Clipper 5.2 und Xbase++ 1.90.331:

Code: Alles auswählen

#ifndef __XPP__
do main
#endif
procedure main
    ? '"Test" =  "Te"', "Test" = "Te"
    ? '"Test" <> "Te"', "Test" <> "Te"
    ? '"Test" #  "Te"', "Test" # "Te"
    ? '"Test" <> ""  ', "Test" <> ""
return
unter Clipper wird folgendes ausgegeben:
BLINKER : Linken war erfolgreich
TEST.EXE (156 Kb) (0.1 Sekunden)
D:\temp>test
"Test" = "Te" .T.
"Test" <> "Te" .F.
"Test" # "Te" .F.
"Test" <> "" .F.
D:\temp>
und Xbase kommt zum gleichen Ergebnis:
"Test" = "Te" J
"Test" <> "Te" N
"Test" # "Te" N
"Test" <> "" N
Mein Gedächtnis hat mich verlassen, wenn set exact off ist, werden wohl alle Zeichenvergleiche nur in der rechten Länge durchgeführt.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Moin Hubert,

ich habe SET EXACT nicht aufgeführt, also steht der wohl auf default OFF.

Und Du hast recht. In der Beschreibung zu SET EXACT steht, daß bei OFF in einem Vergleich immer ein .T. zurückgegeben wird, wenn die rechte Zeichenkette "" ist. Auf den Gedanken muß man erstmal kommen, wenn man SET EXACT garnicht im Programm hat.

Allerdings steht unter Vergleichsoperator "<> # !=" ebenfalls, daß bei SET EXACT OFF in diesem Fall ein .F. herauskäme.

Also wieder einmal RTFM. Dann wäre alles von vorneherein klar gewesen.

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Jan, Hubert,
genau! Und == entspricht einem = mit SET EXACT ON.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten