Seite 1 von 2

Select case : CASE mit mehreren Werten nutzen????

Verfasst: 22.08.2005 12:53
von ingo
Hallo Leute,
ich dotor gerade am meiner Steuerung für einen I2C-Bus Adapter herum. Nun habe ich das Problem, das in einer SELECT CASE Auswertung für fünf verschiedene Werte die gleiche Befehlssequenz ablaufen soll. Nun kann man fünf CASE (wert) <Anweisungen> schreiben.
Kann man in PUREBASIC die fünf Werte auch hinter ein CASE setzen??? So wie in UNIX

Code: Alles auswählen

......CASE Wert1 | Wert2 | Wert3
<Anweisung1>
<Anweisung2>......
CASE.......
Habe in der Hilfe nichts darüber gefunden.
Ich danke allen die Mithelfen
GRUSS
INGO

Re: Select case : CASE mit mehreren Werten nutzen????

Verfasst: 22.08.2005 13:01
von Kiffi
> Kann man in PUREBASIC die fünf Werte auch hinter ein CASE setzen???

nein, kann man leider nicht.

> So wie in UNIX

UNIX? Was ist das denn für eine Programmiersprache? ;-)

Grüße ... Kiffi

Verfasst: 22.08.2005 13:22
von jear

Code: Alles auswählen

If x = xxx Or x=yyy Or x=zzz
  ....
ElseIf x >=  3456
  ....
Else
  ....
EndIf

Verfasst: 22.08.2005 15:47
von ingo
@ Kiffi
Unix ist ein Betriebsystem (so wie Linux). Dort gibt es Schell-Scripte (ähnlich wie eine Batch-Datei unter DOS).

@ jear
Die Idee hatte ich auch, aber ich finde der Code wird dann an dieser Stelle sehr unübersichtlich. Ich habe noch keine Möglichkeit gefunden eine Codezeile umzubrechen. Also nicht so:

Code: Alles auswählen

If  EventGadgetID() = #PCF_8574_A6 Or  EventGadgetID() = #PCF_8574_A5 Or EventGadgetID() = #PCF_8574_A4.......
sondern den Code so zu schreiben:

Code: Alles auswählen

If  EventGadgetID() = #PCF_8574_A6 
    Or  EventGadgetID() = #PCF_8574_A5 
    Or EventGadgetID() = #PCF_8574_A4.......
Oder habe da was übersehen und es geht doch????
GRUSS
INGO

Verfasst: 22.08.2005 17:15
von Kiffi
> @ Kiffi
> Unix ist ein Betriebsystem (so wie Linux).

das ist mir bekannt.

> [Zeilenumbruch]
> Oder habe da was übersehen und es geht doch????

nein, das geht ebenfalls nicht.

Grüße ... Kiffi

Verfasst: 22.08.2005 18:37
von jear
Wie Kiffi schon bescheinigt hat, mehrzeilige Statements gibt es in PB noch nicht.
Wenn die Werte Deiner Konstanten #PCF_8574_A6 ... aber in Reihe sind, kannst Du mit

Code: Alles auswählen

 If EventGadgetID() >= #PCF... AND EventGadgetID()  <= #PCF... 
eine Reihe mit einer Klatsche erschlagen.

Wenn Du die Konstanten selbst festlegst, kannst Du das einfach in einer Enumeration erreichen, in der Du die zusammengehörigen Elemente entsprechend gruppierst.

Verfasst: 23.08.2005 10:57
von hussi

Code: Alles auswählen

Select : EndSelect


Syntax
Select <Ausdruck1>
  Case <Ausdruck2> 
     ...
  [Case <Ausdruck3>]
     ...
  [Default] 
     ...
EndSelect 

Beschreibung

Select erlaubt eine schnelle Auswahl. Das Programm führt den <Ausdruck1> aus und behält dessen Ergebnis im Speicher. Dieses wird mit allen Werten aus den "Case <Ausdrücken>" verglichen, und wenn dieser Vergleich wahr ergibt, wird der zugehörige Programmcode ausgeführt und die Select Struktur beendet. Wenn keiner der Case Werte wahr ist, dann wird der Default Code (sofern definiert) ausgeführt. 
Benutze doch einfach den DEFAULT Wert

VG hussi

Verfasst: 23.08.2005 11:05
von Spirit
Für das Problem mit den mehrzeiligen Anweisungen habe ich vor kurzem ein Tool für die neue IDE geschrieben (hat nur 15 min. gedauert, deshalb sieht der Code, der an den Compiler übergeben wird, nicht sonderlich toll aus)

Hier der Source des Tools:

Code: Alles auswählen

EditorOutput$       =ProgramParameter()
ActivationCommand$  =ProgramParameter()
NewLineCommand$     =ProgramParameter()

If EditorOutput$ And ActivationCommand$ And NewLineCommand$
  
  Activated=#False
  
  If ReadFile(0, EditorOutput$)
    
    Length =Lof()
    *Buffer=AllocateMemory(Length)
    ReadData(*Buffer, Length)
    CloseFile(0)
    
  EndIf
  
  For Pos=0 To Length-1
    
    If Pos<=Length-Len(ActivationCommand$)-1
      If PeekS(*Buffer+Pos, Len(ActivationCommand$))=ActivationCommand$ : Activated!1 : EndIf
    EndIf
    
    If Activated=#True And Pos<=Length-Len(NewLineCommand$)-1
      
      If PeekW(*Buffer+Pos)=2573
        PokeW(*Buffer+Pos, 538976288)
      EndIf
      
      If PeekS(*Buffer+Pos, Len(NewLineCommand$))=NewLineCommand$
        PokeW(*Buffer+Pos, 2573)
      EndIf
      
    EndIf
    
  Next
  
  If CreateFile(0, EditorOutput$)
    
    WriteData(*Buffer, Length)
    CloseFile(0)
    
  EndIf
  
EndIf

End

Einfach zu einer EXE kompilieren und dann in den Werkzeugeinstellungen folgendes einstellen:

Kommandozeile: Pfad zur EXE

Argumente: "%COMPILEFILE" ;MLT ;;

Ereignis zum Auslösen: Vor dem Kompilieren/Starten

Warten bis zum Beenden des Werkzeugs aktivieren

Wenn alles richtig gemacht wurde, kann man den Code auch so schreiben:

Code: Alles auswählen

;MLT;;

a=Random(3)-1;;

If a=1 Or
   a=2 Or
   a=3;;
   
   Debug 1;;
   
EndIf;;
';MLT' - aktiviert bzw. deaktiviert das Tool
';;' - Zeilenumbruch

Verfasst: 23.08.2005 14:52
von Batze
Ich würde es praktischer eher andersherum machen, sodass ein Zeilenumbruch entfernt wird. :allright:

Verfasst: 23.08.2005 19:53
von Spirit
Batze hat geschrieben:Ich würde es praktischer eher andersherum machen, sodass ein Zeilenumbruch entfernt wird. :allright:
So funktioniert es doch auch. Ein 'CRLF' wird durch zwei Spaces ersetzt und ein ';;' durch ein 'CRLF'.