Gå til innhold

if - elseif - else missforståelse.. :)


Anbefalte innlegg

Hei ærede kode-knekkere! Håper dere har mange spennende prosjekter å jobbe på!

 

Jeg trodde jeg forstod if-elseif-else men tydeligvis ikke. Jeg skal ved å se på 1 byte med data avgjøre om ett "flagg" er "heist" eller "senket".. Med andre ord, dersom den mest signifikante biten i byten er en 1'er, så betyr det at jeg har hatt en WatchDogTimeout, dersom den minst signifikante biten er en 1'er så er RelèA påslått...

 

Her er koden som jeg bruker:

'Extract Status Data

Data = DataBuffer(1)

If Data And 128 = 128 Then 'WatchDogTimeout... This is not good...

imgLINAWDTRed.ZOrder

LogOutput = LogOutput & "WDT" & Chr$(&H9&)

ElseIf Data And 128 = 0 Then

LogOutput = LogOutput & "0" & Chr$(&H9&)

 

ElseIf Data And 4 = 4 Then 'DCDC on/off status

imgDCDCGreen.ZOrder

LogOutput = LogOutput & "DCDC On" & Chr$(&H9&)

ElseIf Data And 4 = 0 Then

imgDCDCRed.ZOrder

LogOutput = LogOutput & "DCDC Off" & Chr$(&H9&)

 

ElseIf Data And 2 = 2 Then 'Relay B on/off status

imgRelayBGreen.ZOrder

LogOutput = LogOutput & "1" & Chr$(&H9&)

ElseIf Data And 2 = 0 Then

imgRelayBRed.ZOrder

LogOutput = LogOutput & "0" & Chr$(&H9&)

 

ElseIf Data And 1 = 1 Then 'Relay A on/off status

imgRelayAGreen.ZOrder

LogOutput = LogOutput & "1 RelayA" & Chr$(&H9&)

ElseIf Data And 1 = 0 Then

imgRelayARed.ZOrder

LogOutput = LogOutput & "0 RelayA" & Chr$(&H9&)

End If

 

Data er oftest 105 når jeg kjører programmet, men mha break-points så har jeg fått bekreftet at programmet alldrig går inn noe annet sted enn der jeg skriver ut "WDT" til LogOutput. Tydeligvis har jeg missforstått ElseIf her?

 

Trodde det var slik at

IF noe=nøkkel så gjør slik

ellerom noe=nøkkel2 så gjør slik

ellerom noe=nøkkel3 så gjør slik

....

eller (noe = hva som helst som ikke er dekket over) så gjør slik

 

DOH DOH DOH!! :roll::blush:

 

Jaja. Er det bare jeg som kommer på svaret sjøl når jeg prøver å forklare problemet for andre?? :whistle:

 

OK.. La meg spørre om noe annet da: Jeg ser ikke helt hvordan jeg kan bruke Switch/Case her siden jeg må "and'e" dataet hele tiden eller? Noen forslag på å gjøre som jeg vil at koden skal gjøre uten å bruke IF-elseif-else siden det -IKKE- fungerer av nå åpenbare grunder... :cool:

 

Takk

[edit farger... hvorfor kommer ikke "space" karakterene med? Jeg hadde faktisk innrykk på koden min.. :( ]

Endret av Dargar
Lenke til kommentar
Videoannonse
Annonse

Etter hva jeg har forstått, vil du teste for ymse bit i en variabel, og utføre kode deretter. Den enkleste måten å gjøre dette på, må være som følgende:

 

Data = DataBuffer(1)

If Data And 128 = 128 Then 'WatchDogTimeout... This is not good...
   imgLINAWDTRed.ZOrder
   LogOutput = LogOutput & "WDT" & Chr$(&H9&)
Else
   LogOutput = LogOutput & "0" & Chr$(&H9&)
End If

If Data And 4 = 4 Then 'DCDC on/off status
   imgDCDCGreen.ZOrder
   LogOutput = LogOutput & "DCDC On" & Chr$(&H9&)
Else
   imgDCDCRed.ZOrder
   LogOutput = LogOutput & "DCDC Off" & Chr$(&H9&)
End If

If Data And 2 = 2 Then 'Relay B on/off status
   imgRelayBGreen.ZOrder
   LogOutput = LogOutput & "1" & Chr$(&H9&)
ElseIf Data And 2 = 0 Then
   imgRelayBRed.ZOrder
   LogOutput = LogOutput & "0" & Chr$(&H9&)
End If

If Data And 1 = 1 Then 'Relay A on/off status
   imgRelayAGreen.ZOrder
   LogOutput = LogOutput & "1 RelayA" & Chr$(&H9&)
Else
   imgRelayARed.ZOrder
   LogOutput = LogOutput & "0 RelayA" & Chr$(&H9&)
End If

 

ElseIf er kun et nøkkelord som forlenger IF-setningen, men den kan ikke brukes i sammenhenger hvor du ønsker at flere av alternativene skal kjøres. I en IF-setning vil alltid bare ET av de mulige utfallene komme til uttrykk - intet mer.

Lenke til kommentar

Switch/Case vil ikke fungere her fordi både svaret og "utregningen" til svaret er forskjellig hver gang.

Select Case Data And 128
   
   Case 1
       
       MsgBox "Svaret er 1"
       
   Case 2
       
       MsgBox "Svaret er 2"
       
   Case 128
       
       MsgBox "Svaret er 128"
       
End Select

Ser du? Det vil ikke funke.

 

Kansje jeg har misforstått her, men bruker du ikke And-operatøren litt feil nå? Skal ikke den returnere True hvis begge tingene er True?

 

If-Else-koden er korrekt. (Den er nok ikke problemet)

 

Edit: Aadnk kom først. Forresten, man får innrykk hvis man setter koden inn i en CODE-tag.

Edit: Nei, jeg har misforstått..

Endret av Jonas
Lenke til kommentar

Derimot hadde jeg glemt paranteser... Peste litt før jeg fant ut hvorfor den alldrig filtrerte ut når biter var 0... :)

 

jeg hadde jo slik

 

if Data and 128 = 128 'alltid true fordi Data ikke er tom og fordi 128 alltid er lik med 128....

 

men slik ble det bedre..

 

if (Data and 128) = 128

 

:)

 

Takk for all hjelp!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...