DargarWhiteFang Skrevet 23. januar 2005 Del Skrevet 23. januar 2005 (endret) 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!! Jaja. Er det bare jeg som kommer på svaret sjøl når jeg prøver å forklare problemet for andre?? 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... Takk [edit farger... hvorfor kommer ikke "space" karakterene med? Jeg hadde faktisk innrykk på koden min.. ] Endret 23. januar 2005 av Dargar Lenke til kommentar
aadnk Skrevet 23. januar 2005 Del Skrevet 23. januar 2005 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
Jonas Skrevet 23. januar 2005 Del Skrevet 23. januar 2005 (endret) 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 23. januar 2005 av Jonas Lenke til kommentar
GeirGrusom Skrevet 23. januar 2005 Del Skrevet 23. januar 2005 Nei, And returnerer 128 hvis X And 128, null hvis det bitet ikke er satt. "If Data And 128 Then" tror jeg holder, True = -1, eller alt annet en null. And er bitwise eller logical and, utifra sammenhengen den blir brukt i, står forklart i MSDN. Lenke til kommentar
DargarWhiteFang Skrevet 23. januar 2005 Forfatter Del Skrevet 23. januar 2005 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå