Select Case reagiert falsch auf Integer = 0

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Select Case reagiert falsch auf Integer = 0

      Hallo,

      ich habe hier ein Code der wie folgt ausschaut,

      BASCOM-Quellcode

      1. $regfile = "usb162.dat"
      2. $crystal = 8000000
      3. Config Portd.3 = Output
      4. Interfaceactivated Alias Portd.3
      5. Interfaceactivated = 0
      6. Config Portd.5 = Output
      7. Errorled Alias Portd.5
      8. Errorled = 0
      9. Dim Deviceadresse As Byte
      10. Dim Wert1 As Integer
      11. Dim Wert2 As Byte
      12. Deviceadresse = 0
      13. Wert1 = 0
      14. Wert2 = 1
      15. Do
      16. If Wert1 = Deviceadresse Then
      17. Select Case Wert2
      18. Case 0
      19. Interfaceactivated = 1
      20. Case 1
      21. Errorled = 1
      22. End Select
      23. Waitms 1
      24. Interfaceactivated = 0
      25. Errorled = 0
      26. End If
      27. Loop
      Alles anzeigen
      Wenn Deviceadresse = 0 und Wert1 = 0 ist, werden in der Select Case beide Cases abgearbeitet.
      Verstehe nicht warum?
      Es müsste nur Case = 1 abarbeiten.

      Aber wenn ich Deviceadresse = 1 und Wert1 = 1 habe, dann wird nur der Case 1 abgearbeitet.

      Weis einer warum das so ist?
      VG
      Katip
    • mach mal das waitms größer, 1 ms ist für das Auge schon schnell, ob man bei so einer schleife ein Gleichzeitig oder schnell hintereinander erkennen kann, ich weiß nicht.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • six1 schrieb:

      Gelöst wäre es, wenn du den Syntax von "Select" richtig verwenden würdest.

      Syntax
      SELECT CASE var
      CASE test1 : statements
      [CASE test2 : statements ]
      CASE ELSE : statements
      END SELECT

      Im Programmdurchlauf wird wegen fehlender Doppelpunkte alles abgearbeitet zwischen "Select" und "end select"
      so sehe ich das nicht. Der : lässt einen weiteren Befehl, neben der case-Abfrage, in derselben Zeile zu. Der case kann natürlich auch eine Reihe von Befehlen auslösen, die man in mehrere Zeilen schreiben kann. So funktionieren bei mir viele case-Abfragen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • ich schreib' ja nicht, das die Hilfe falsch ist, die zeigt halt eine Möglichkeit. @Mitch64, deine Beispiele im statemachine-tutorial, funktionieren die? Da gibt es auch Mehrzeiler nach einen case, genau so, wie ich es meine.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Den zwingenden Doppelpunkten würde ich jetzt auch widersprechen wollen.

      Nur als Beispiel, aber der folgende Code funktioniert bei mir erwartungsgemäß (es wird jeweils nur der einzelne Case-Zweig abgehandelt, die Bedingung ist hier übrigens eine Konstante, wird also vom Kompiler entsprechend umgewandelt und ist zur Laufzeit auch keine Variable).
      Und das funktioniert auch schon in älteren Versionen von BasCom.
      Und (wahrscheinlich nicht nur) ich schreibe die Select-Case Abfragen nur in diesem Stil und eben nie ohne diesen Doppelpunkt und die funktionieren in jeder Anwendung genau so wie ich es jeweils erwartet hatte.

      Ich meine, dass es wegen dem Doppelpunkt in der Vergangenheit schon mal eine Diskussion gab, war aber IMHO noch im "alten" Forum.

      Und zur Hilfe sage ich jetzt nur, sie Hilft oft und da auch sehr gut, immer tut sie das aber nicht :D .
      Auch "finde" ich dann und wann Fehler die ich gar nicht gesucht habe ^^ .
      Es gibt aber nun mal nichts was perfekt ist.

      Soweit ich das verstehen würde, ist der Doppelpunkt an der Stelle genau das was er auch anderswo in Code ist nämlich ein Befehlstrennzeichen welches dann notwendig ist, wenn in der gleichen Zeile ein weiterer Befehl angegeben wird.

      Steht der erste Befehl in einer neuen Zeile hinter Case ist dieser Doppelpunkt aber nicht mehr erforderlich, stört aber auch nicht.
      An dieser Stelle ist die Hilfe IMHO offenbar etwas unglücklich, da diese nur einen einzigen Befehl annimmt aber eben keine Befehlsfolge die ja zweifellos auch erlaubt ist, in der Hilfe dann aber nicht mehr dargestellt wird.

      BASCOM-Quellcode

      1. Select Case fK
      2. Case Key_1 ' 100er
      3. Incr fH
      4. If fH > 2 Or Is256(fH , fZ , fE) = 1 Then
      5. fH = 0
      6. End If
      7. Key_Wait_None
      8. iTime = 0
      9. Case Key_2 ' 10er
      10. Incr fZ
      11. If fZ > 9 Or Is256(fH , fZ , fE) = 1 Then
      12. fZ = 0
      13. End If
      14. Key_Wait_None
      15. iTime = 0
      16. Case Key_3 ' 1er
      17. Incr fE
      18. If fE > 9 Or Is256(fH , fZ , fE) = 1 Then
      19. fE = 0
      20. End If
      21. Key_Wait_None
      22. iTime = 0
      23. Case Key_8 ' Wertansage
      24. MP3_Stop
      25. Waitms 100
      26. iTime = MS_2000
      27. fWh = 65535
      28. Case Key_9 ' Ansage wiederholen
      29. MP3_Stop
      30. Waitms 100
      31. Case Key_R
      32. Exit Do
      33. Case Key_0 ' Ansage stoppen
      34. Case Is <> Key_None
      35. NoMenuOut
      36. End Select
      Alles anzeigen
    • Hallo Katip,
      habe das auch mal im Simulator laufen lassen und kann Mitch64 bestätigen es Funktioniert.
      Wie sieht es den aus wenn du Stack Werte mit einträgst ist das dann genauso?

      katipefendi schrieb:

      Wie testet man sowas im Simulator?
      Ich mache das mal etwas ausführlicher.
      Habe mal dein Programm etwas erweitert.

      BASCOM-Quellcode

      1. $regfile = "usb162.dat"
      2. $crystal = 8000000
      3. $sim
      4. Config Portd.3 = Output
      5. Interfaceactivated Alias Portd.3
      6. Interfaceactivated = 0
      7. Config Portd.5 = Output
      8. Errorled Alias Portd.5
      9. Errorled = 0
      10. Dim Deviceadresse As Byte
      11. Dim Wert1 As Integer
      12. Dim Wert2 As Byte
      13. Dim Zaehler As Byte
      14. Deviceadresse = 0
      15. Wert1 = 0
      16. <span id="selection-marker-1" class="redactor-selection-marker"></span>Wert2 = 1
      17. Print "Deviceadresse :" ; Deviceadresse
      18. Print "wert1 :" ; Wert1
      19. Print "Wert2 :" ; Wert2
      20. Do
      21. Incr Zaehler
      22. If Wert1 = Deviceadresse Then
      23. Select Case Wert2
      24. Case 0
      25. Interfaceactivated = 1
      26. Case 1
      27. Errorled = 1
      28. End Select
      29. Waitms 1
      30. Interfaceactivated = 0
      31. Errorled = 0
      32. End If
      33. Loop
      Alles anzeigen

      -$sim eingefügt damit werden eventuelle waits deaktiviert
      (dies verhindert das Aufhängen des Simulators)
      Wie Mitch64 schon geschrieben hat.
      -Programm kompilieren
      -F2 Simulator starten
      -dann oben Links auf Variables Klicken dort kannst du deine Variablen eintragen die du beobachten möchtest.
      -dann auf den Button links neben Terminal klicken und dann noch auf den LCD Button klicken
      dort kannst du dann deine Ausgänge sehen.
      So das waren erstmal die Vorbereitung jetzt kannst du mit F8 das Programm schrittweise durchgehen.
      Nicht vergessen das $sim wieder rausnehmen und nochmal kompileren.
      So dann viel Spaß beim Testen.

      Gruß
      businski
      Dateien
      • sim1.JPG

        (68,87 kB, 14 mal heruntergeladen, zuletzt: )
    • katipefendi schrieb:

      Und ich sehe, das alle beide kurz leuchten.
      Bei mir leuchtet eine ohne erkennbare Pause (7µs). Die Reihenfolge macht hier auch keinen Unterschied. (das is= auch nicht). Es war auch keine Relextion der einen in die zweite Led? Aus dem Waitms ein
      wait 1 und noch eins vor dem Loop sollte klar erkennen lassen was passiert.
      Die Doppelpunkte mögen bei einer Anweisung brauchbar sein bei mehreren machen sie es schlechter lesbar.
      Da ist die Methode mit dem Einrücken (2 nicht 20 Stellen ;_))schöner
    • Ich mache schon über ein Jahrzehnt mit Bascom rum.
      Ich habe nie einen Doppelpunkt nach "Case <Konstante>:" gemacht, außer wenn in der gleichen Zeile noch eine Anweisung/Befehl folgt.

      So interpretiere ich auch die Bascomhilfe. Dort steht ja auch Case : Statement in einer Zeile.

      Ich denke nicht dass es daran liegt.

      Meines Wissens wird das "Case Is" auch nur bei Vergleichen benötigt, etwa "Case Is <=7" oder "Case Is > 5" um mal 2 Beispiele zu zeigen.

      Aber es geht ja um das eingangs erwähnte Problem.

      Mir ist aufgefallen, dass keine Stackwerte definiert sind.
      Das sollte obligatorisch immer gemacht werden.

      Nach meiner Erfahrung ist oft ein zu kleiner Stack die Ursache von Effekten die auftreten können.

      Probier also mal für die Stacks jeweils 32 oder 64 zu nehmen.
      Wenn dein Effekt bleibt wenn alle Stackwerte auf 64 sind, kann der als Ursache ausgeschlossen werden.

      Welche Bascom-Version verwendest du denn? Und welches Betriebssystem?