2017-02-23 4 views
1

Got ein bizarres Problem in einer IF Erklärung mit mehreren Bedingungen. Die letzte funktionierende Version sieht so aus:VB6 mehrere IF-Anweisung bizarre Ausgabe

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And VAR3 = 1 Then 

Und jetzt habe ich eine weitere Bedingung zur Erklärung implementieren:

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And (VAR3 = 1 or VAR3 = 15) Then 

Mit diesen Werten: VAR1: "" (leer) VAR2: "FIN" VAR3: 1

Der Code wird es in Debug gut funktionieren. Das Bizarre kompiliert und läuft auf der Produktionsumgebung, der Zustand ging selbst bei der ersten Bedingung nicht in Ordnung.

Die Werte wurden bereits protokolliert. Die Produktionsumgebung enthält die gleichen Dateien (Bibliotheken).

Die einzige Sache, die sich neben der Bedingung geändert hat, ist die Option Explicit zu Beginn dieses Moduls.

Danke !!

+0

'On Error Resume Next' und' VAR1' ist null? – wqw

+2

Instr gibt die Position der Übereinstimmung zurück (entweder 1 oder 5 oder 0.) Der And-Operator ist in VB6 bitweise. Ein TRUE-Wert ist -1, also alle Bits Sie sollten nach dem Ergebnis von Instr suchen, das> 0 ist. Das wird entweder 0 oder -1 zurückgeben und Ihr Ausdruck wird korrekter sein. –

+0

Ich habe das gesehen, aber in diesem Fall konvertiert vb6 implizit jeden Wert> 0 in True. –

Antwort

2

Nichts für ungut, aber das ist einfach viel zu schwer zu parsen, und das ohne triftigen Grund. Wenn Sie mit And Bedingungen arbeiten, sind Sie weit besser dran mit verschachtelten If s, indem Sie die unwahrscheinlichen Bedingungen zuerst und die teuersten Tests so lange wie möglich platzieren. Das ist viel klarer, und mit ziemlicher Sicherheit schneller:

If VAR1 = "SCRT" Then 
If InStr("|TEC|FIN|", "|" & VAR2 & "|")) > 0 Then 
    If (VAR3 = 1) or (VAR3 = 15) Then 

Diese Kurzschlüsse erlaubt, die in VB6 sonst nicht verfügbar ist. Der Code wird nicht schneller ausgeführt, nur weil er sich in einer Zeile befindet.

Zwei Änderungen: Test If Instr > 0 anstatt nur If Instr. Ja, VB wird einen erfolgreichen Test auf True/False, , aber auswerten, es wird niemals die Not dieses Ausdrucks zu False bewerten, die Sie eines Tages beißen wird. Glaube es. (-:

Zweite Änderung: Früher habe ich Pars die Rangordnung zu zwingen, für die Or Bedingungen Es Regeln sind, aber man könnte so etwas wie If VAR3 = (1 Or VAR3) = 15 bekommt, wenn man es am wenigsten erwarten Formulieren und es gibt keine Überraschungen

...
+0

Überprüfung> 0 ist auch besser "defensive" Programmierung. Da es expliziter ist, ist es für einen zukünftigen Programmierer weniger wahrscheinlich, eine Änderung vorzunehmen, die es bricht. – DaveInCaz

+0

Ich habe vereinfacht, aber dies ist nur eine von vielen Bedingungen in einer Liste von Regeln. Die echte Funktion hat viele andere Möglichkeiten und wenn ich eine Bedingung in eine andere stelle, wird der Code unordentlich ... Erste Änderung: Ich habe bereits die> 0 ... = D Zweite Änderung: nicht verstanden die Bedingung 'Wenn VAR3 = (1 oder VAR3) = 15 '. Warum stellst du die Parens so? Danke !! –

+0

@FernandoMoreno - Das war nur ein Beispiel für die Art von Problem, die auftreten könnte, wenn Sie die Regeln des Vorrangs verstehen, die nicht mit denen des Compilers übereinstimmen. Sehen Sie im Codeblock nach meiner tatsächlichen Empfehlung. Seien Sie explizit: Fügen Sie Parens hinzu, um die Auswertung zu erzwingen, wenn es zu Verwechslungen kommen könnte - es tut nie weh, –