Warunek w C na Bascom

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
j23
-
Posty: 4
Rejestracja: 14 kwie 2006, 9:46

Warunek w C na Bascom

Post autor: j23 » 14 kwie 2006, 10:00

Witam

Czy może ktoś wie jak poniższy warunek w C przedstawić w Bascomie AVR

if ((SWCounter >= Time_ptr) && (!((SWCounter > (WORD16MAX - EXEC_CONST)) && (Time_ptr < EXEC_CONST))))


j23

tasza
Użytkownik
Posty: 1391
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 14 kwie 2006, 10:16

może tak?

Kod: Zaznacz cały

 If (SWCounter >= Time_ptr) And Not ((SWCounter > (WORD16MAX - EXEC_CONST)) And (Time_ptr < EXEC_CONST)) Then
      ' .....  
 End If

j23
-
Posty: 4
Rejestracja: 14 kwie 2006, 9:46

Post autor: j23 » 14 kwie 2006, 11:39

Dziękuję za odpowiedź.

Logicznie Twój kod wygląda ok. Niestety składnia Bascoma nie pozwala na taki zapis.

Ja częściowo rozpisałem to tak:

Kod: Zaznacz cały

If Swcounter >= Time_ptr Then
  Word16max = Word16max - Exec_const
   If Swcounter > Word16max And Time_ptr < Exec_const Then      'Ten warunek ma być NOT
     ' .....
   End If
End If
Nie wiem jak użyć operatora NOT przekształcającego warunek prawdziwy na fałszywy, a warunek fałszywy na prawdziwy.


j23

tasza
Użytkownik
Posty: 1391
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 14 kwie 2006, 12:50

Kod: Zaznacz cały

If Swcounter >= Time_ptr Then
  Word16max = Word16max - Exec_const
   If Swcounter > Word16max And Time_ptr < Exec_const Then      'Ten warunek ma być NOT
     ' .....
   End If
End If
hmm, składnię sprawdziłam w VB, jakoś nie mam bascoma pod ręką...

co do NOT-a, jest taka zależność.... /(a*b) == /a + /b i odwrotnie /(a+b) == /a * /b więc:

Kod: Zaznacz cały

If Swcounter >= Time_ptr Then
  Word16max = Word16max - Exec_const
   If Swcounter <= Word16max Or Time_ptr >= Exec_const Then      
     ' .....
   End If
End If
:roll:

j23
-
Posty: 4
Rejestracja: 14 kwie 2006, 9:46

Post autor: j23 » 18 kwie 2006, 12:34

Wielkie dzięki. Działa!

Poniższe warunki są równoważne:

Kod: Zaznacz cały

C

if ((SWCounter >= Time_ptr) && (!((SWCounter > (WORD16MAX - EXEC_CONST)) && (Time_ptr < EXEC_CONST)))) 

Kod: Zaznacz cały

Bascom

If Swcounter >= Time_ptr Then
  Word16max = Word16max - Exec_const
   If Swcounter <= Word16max Or Time_ptr >= Exec_const Then     
     ' .....
   End If
End If
Zastosowanie prawa DeMorgana do przekształcania powyższych wyrażeń logicznych, jest b.dobrym rozwiązaniem.

Zastosowane prawo DeMorgana:

Negacja koniunkcji jest równa alternatywie negacji: NOT(a AND b) = (NOT a) OR (NOT b)


Jeszcze raz dziękuję za pomoc.

j23

ODPOWIEDZ