Benutzer mit den meisten Antworten
Select Case funktioniert nicht wie gewünscht

Frage
-
Hallo,
ich will Winkelwerte mit einer Select Case - Anweisung auswerten.Dim angle As Double = 124.78
Select Case angle
Case 0, 90, 180, 270
Return 1
Case Is > 0 And CInt(angle < 90)
Console.WriteLine("Wert > 0 und < 90") 'in diese Case-Anweisung wird gesprungen, was bei einem Wert von 124.78 falsch ist
Case Is > 90 And CInt(angle < 180)
Console.WriteLine("eigentlich muss in diese Case-Anweisung gesprungen werden") 'hier ist eigentlich das Ziel
Case Is > 180 And CInt(angle < 270)
'
Case Is > 270 And CInt(angle < 360)
'
End SelectKann mir jemand sagen, warum nicht "Case Is > 90 And CInt(angle < 180)" als richtiger Case-Zweig erkannt wird?
Was muss ich ändern?
Alexander- Typ geändert Robert BreitenhoferModerator Montag, 23. Mai 2011 12:59 Frage
Antworten
-
Hallo Alexander,
Kann mir jemand sagen, warum nicht "Case Is > 90 And CInt(angle < 180)" als richtiger Case-Zweig erkannt wird?
weils totaler Quatsch ist, was da steht? :)
Ich weiß zwar nicht, was da wirklich bei rumkommen würde aber lies mal einfach ein wenig was zu "Is" und "And", wie Du sie hier verwendest.
http://msdn.microsoft.com/de-de/library/kb136x1y.aspx
http://msdn.microsoft.com/de-de/library/sdbcfyzh.aspx
Das hat hier mit dem, was Du machen willst, nix zu tun.
Eine Lösung könnte bspw. so aussehen:---
Select Case x
Case 0, 90, 180, 270, 360
...
Case 0 To 90
...
Case 90 To 180
...
Case 180 To 270
...
Case 270 To 360
...
End Select---
Man könnte zwar auch mit 90.00000000001 oder ähnlichem anfangen, da aber von oben nach unten gearbeitet wird und der erste erreichbare Zweig den Select wieder beendet, sollte das so passen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Robert BreitenhoferModerator Montag, 23. Mai 2011 13:00
-
Wenn in der Select-Anweisung eine Variable steht, muss in denCase-Anweisungen ein Wert stehen, auf den als Inhalt dieser Variablengeprüft werden kann (oder auch eine Liste, ggf. auch Vergleich-Operatoren.Bei "Case Is > 0 And CInt(angle < 90)" kann der Compiler nicht erkennen, ober den Wert vom Typ Double oder vom Typ Boolean ggf. mit einer implizitenKonvertierung (bei Option Strict Off) prüfen soll.Für solche Fälle ist es einfacher, auf True zu selektieren (geht nur inVB.NET):Dim angle As Double = 124.78Select Case TrueCase angle=0 OR angle=90 OR angle=180 OR angle=270Return 1Case angle > 0 And angle < 90Console.WriteLine("Wert > 0 und < 90")Case angle > 90 And angle < 180Console.WriteLine("eigentlich muss in diese Case-Anweisung gesprungenwerden")Case angle > 180 And angle < 270'Case angle > 270 And angle < 360'End SelectZu beachten ist aber auch, dass der Typ double ggf. wegen der begrenztenMantissenlänge Rundungsfehler bewirken kann und z.B. eine Prüfung aufangle=90 bei angle=89.99999 nicht erfolgreich sein kann. Es sollte beisolchen Abfragen ggf. ein epsilon für Abweichungen (Rundungen) vorgesehenwerden.--Viele GrüßePeter
- Als Antwort markiert Robert BreitenhoferModerator Montag, 23. Mai 2011 12:59
Alle Antworten
-
Hallo Alexander,
Kann mir jemand sagen, warum nicht "Case Is > 90 And CInt(angle < 180)" als richtiger Case-Zweig erkannt wird?
weils totaler Quatsch ist, was da steht? :)
Ich weiß zwar nicht, was da wirklich bei rumkommen würde aber lies mal einfach ein wenig was zu "Is" und "And", wie Du sie hier verwendest.
http://msdn.microsoft.com/de-de/library/kb136x1y.aspx
http://msdn.microsoft.com/de-de/library/sdbcfyzh.aspx
Das hat hier mit dem, was Du machen willst, nix zu tun.
Eine Lösung könnte bspw. so aussehen:---
Select Case x
Case 0, 90, 180, 270, 360
...
Case 0 To 90
...
Case 90 To 180
...
Case 180 To 270
...
Case 270 To 360
...
End Select---
Man könnte zwar auch mit 90.00000000001 oder ähnlichem anfangen, da aber von oben nach unten gearbeitet wird und der erste erreichbare Zweig den Select wieder beendet, sollte das so passen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Robert BreitenhoferModerator Montag, 23. Mai 2011 13:00
-
Wenn in der Select-Anweisung eine Variable steht, muss in denCase-Anweisungen ein Wert stehen, auf den als Inhalt dieser Variablengeprüft werden kann (oder auch eine Liste, ggf. auch Vergleich-Operatoren.Bei "Case Is > 0 And CInt(angle < 90)" kann der Compiler nicht erkennen, ober den Wert vom Typ Double oder vom Typ Boolean ggf. mit einer implizitenKonvertierung (bei Option Strict Off) prüfen soll.Für solche Fälle ist es einfacher, auf True zu selektieren (geht nur inVB.NET):Dim angle As Double = 124.78Select Case TrueCase angle=0 OR angle=90 OR angle=180 OR angle=270Return 1Case angle > 0 And angle < 90Console.WriteLine("Wert > 0 und < 90")Case angle > 90 And angle < 180Console.WriteLine("eigentlich muss in diese Case-Anweisung gesprungenwerden")Case angle > 180 And angle < 270'Case angle > 270 And angle < 360'End SelectZu beachten ist aber auch, dass der Typ double ggf. wegen der begrenztenMantissenlänge Rundungsfehler bewirken kann und z.B. eine Prüfung aufangle=90 bei angle=89.99999 nicht erfolgreich sein kann. Es sollte beisolchen Abfragen ggf. ein epsilon für Abweichungen (Rundungen) vorgesehenwerden.--Viele GrüßePeter
- Als Antwort markiert Robert BreitenhoferModerator Montag, 23. Mai 2011 12:59