[BASCOM] "IF" Abfrage "verkürzen" mit mehreren Definitionen

OP #4403822
Lesenswert?

Guten Abend

Ich habe ein Problem mit einer einfachen IF Abfrage:

Ich habe ein "Byte" an Zahlen, welche ich in 4 IF-Abfragen auswerten 
möchte.

z.B. die Zahlen 1, 5, 9, 13, 17, .... usw..

Für einen Zahlenwert von 255 wären das in einer Viertelung mindestens 63 
Werte.

Ich möchte jetzt aber nicht 63 IF-Abfragen machen, sondern die vier 
Zahlenstränge in je einer Abfrage unterbringen.

Derzeit war DAS mein letzter Versuch:
1
If Rotary =(1 | 5| 9 | 13 | 17 | 21 | 25 | 29 | 33 | 37 | 41 | 45 | 49 | 53 | 57| ...) Then
2
...
3
End If
Ich habe es mit Kommata versucht und diversen anderen 
Trennmöglichkeiten.


Entweder sehe ich den "Wald" derzeit nicht mehr, oder ich habe ein 
Syntax Problem....


Kann mir bitte einer helfen bei dem Problem?

Danke und Grüße
Gast #4403843
Lesenswert?

Denis I. schrieb:
> Vlt. fällt einem noch was anderes ein :)

Das war bereits der optimale Einfall, solange die Reihe einer Regel 
gehorcht, hier durch 4 teilbar und Rest immer 1.

Wär's nicht so, so könnte man eine Reihe "Data"-Anweisungen nehmen und 
per Schleife alles durchprobieren. Aber viel zuviel Aufwand, wenn's 
durch Modulo zu lösen ist.
#4403849
Lesenswert?

Versuche es mal mit Select-Käse, äh Case

Dim Eingabe As Byte
Input "Gib einen Wert ein! (0-255) " , Eingabe

Select Case Eingabe

 Case 0 To 63 :    Print "Liegt zwischen 0 und 63"
 Case 64 To 127 :  Print "Liegt zwischen 64 und 127"
 Case 128 To 192 : Print "Liegt zwischen 128 und 192"
 Case 193 To 255 : Print "Liegt zwischen 192 und 255"
 Case Else :       Print "Eingabe war Käse!"

End Select

Print "MfG Paul"

Edith sagt: So schnell kann ich nicht tippen...
OP #4403963
Lesenswert?

Ich habe mich gerade auf Lookup() eingeschossen.

So wie es aussieht bekomme ich es aber nicht in eine "IF" Abfrage rein.

Mein Gedanke war:

gedankenspielan
Wenn "Rotary" einen Wert entspricht der in "Lookup(taba , A1l)" Tabelle 
zu finden ist, dann schalte ggf. PIN XY auf H.
gedankenspielaus

Also ungefähr so:
1
If Rotary = Lookup(taba , A1l) Then
2
...
3
End If
4

5
A1l:
6
Data 1 , 5 , 9 , 13 , 17 , ...

"Taba" habe ich als Byte bestimmt.

Ich habe insgesamt ja 4 DATA Tabellen, mit je unterschiedlichen Werten 
der 255, welche in vier "IF" Abfragen ausgewertet werden sollen.

Die vorangeführte Tabelle und diese 3:

B1l:
Data 2 , 6 , 10 , 14 , 18 , ...

A2l:
Data 3 , 7 , 11 , 15 , 19 , ...

B2l:
Data 4 , 8 , 12 , 16 , 20 , ...


Wo ist mein Fehler?
Persönliche Seite #4403989
Lesenswert?

Denis I. schrieb:
> Ich habe mich gerade auf Lookup() eingeschossen.

Das erscheint mir unnötig umständlich.

Wenn ich es recht verstanden habe, möchtest Du folgendes erreichen:

- für die Werte 0, 4, 8, 12, 16 etc. bis 252
  soll Funktion A aufgerufen werden

- für die Werte 1, 5, 9, 13, 17 etc. bis 253
  soll Funktion B aufgerufen werden

- für die Werte 2, 6, 10, 14, 18 etc. bis 254
  soll Funktion C aufgerufen werden

- für die Werte 3, 7, 11, 15, 19 etc. bis 255
  soll Funktion D aufgerufen werden


Dann wird Dein Code mit MOD (Modulo) recht überschaubar:
1
DIM Wert AS BYTE
2
DIM Eingedampft AS BYTE
3

4
...
5

6
Eingedampft = Wert MOD 4
7

8
SELECT CASE Eingedampft
9

10
  CASE 0 : CALL Funktion_A
11

12
  CASE 1 : CALL Funktion_B
13

14
  CASE 2 : CALL Funktion_C
15

16
  CASE 3 : CALL Funktion_D
17

18
END SELECT
OP #4404041
Lesenswert?

1
$regfile = "attiny2313.dat"
2
$crystal = 8000000
3

4
Config Portb.2 = Output
5
Config Portb.3 = Output
6
Config Portb.4 = Output
7
Config Portb.5 = Output
8

9
A1 Alias Portb.2
10
B1 Alias Portb.3
11
A2 Alias Portb.4
12
B2 Alias Portb.5
13

14
Dim Rotary As Byte                                          'der wird in 255 Schritten übergeben von anderer Stelle
15
Dim Machwas As Byte
16

17
Declare Sub Funktion_a()
18
Declare Sub Funktion_b()
19
Declare Sub Funktion_c()
20
Declare Sub Funktion_d()
21

22
Do
23

24
   Machwas = Rotary Mod 4
25

26
If Machwas = 0 Then
27
      Call Funktion_a
28
   Elseif Machwas = 1 Then
29
      Call Funktion_b
30
   Elseif Machwas = 2 Then
31
      Call Funktion_c
32
   Elseif Machwas = 3 Then
33
      Call Funktion_d
34
   End If
35
Loop
36
End
37

38

39

40
Funktion_a:
41
A2 = 0
42
B1 = 0
43
B2 = 0
44
A1 = 1
45
Return
46

47
Funktion_b:
48
A2 = 0
49
B2 = 0
50
A1 = 0
51
B1 = 1
52
Return
53

54
Funktion_c:
55
B2 = 0
56
A1 = 0
57
B1 = 0
58
A2 = 1
59
Return
60

61
Funktion_d:
62
A1 = 0
63
B1 = 0
64
A2 = 0
65
B2 = 1
66
Return

@ Kurt:

Ja das kann sein, aber habe inzwischen eine kleine Ahnung was Mod macht.


Ich habe jetzt einen Dummy Code eingefügt mit den hier besprochenen 
Parametern.

Nur mir wird gerade nicht klar wie der Code im richtigen Syntax zusammen 
gebracht wird.
Ich sitze anscheinend schon zu lange heute vor dem PC...


*Was ich verstanden habe:*

"Modu" macht bei einem "4" Zahlenwerte von 0 bis 3 aus dem "Rotary".
Damit rufe ich dann meine Unterprogramme auf und springe danach wieder 
zurück.

Die "Call Case" Funktion wird in der Hauptschleife ausgeführt.
Ähnlich wie Gosub XY?

Der Schlauch auf dem ich gerade stehe ist groß..... Mist

EDIT:

Der Code macht jetzt das was ich möchte bzw. nur jeden 4ten Wert macht 
er das..., aber ich kann mir doch nicht Modu zusammen reimen.

Kann mir das bitte einer erklären?
Aus der Bascom hilfe werde ich nicht ganz schlau draus....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren