[AVRGCC] nie rozumiem wyrażenia

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
hubertp
-
Posty: 25
Rejestracja: 30 paź 2007, 16:01
Lokalizacja: mińsk maz.

[AVRGCC] nie rozumiem wyrażenia

Post autor: hubertp » 16 wrz 2008, 16:23

Uczę się obecnie programowania w GCC. W książce którą obecnie czytam:
"Mikrokontrolery AVR programowanie w języku C" jest wyrażenie na stronie 52:

Kod: Zaznacz cały

if ((tmp=(flags1 & P1))==1)
Co ono oznacza :shock: :?: bo za Chiny nie mogę zrozumieć.Pozdrawiam.

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

Post autor: tasza » 16 wrz 2008, 16:40

Kod: Zaznacz cały

flags1 & P1
zwróci wartość będącą iloczynem logicznym (AND-em) kolejnych bitów zmiennej flags1
i tego co zostało zapisane ostatnio do P1
port P1 nie zostanie odczytany w sensie pobrania stanu logicznego
wyprowadzeń kontrolera, do tego służy PIN

Kod: Zaznacz cały

tmp=(flags1 & P1)
wynik w/w and-a zostanie podstawiony do zmiennej tmp

Kod: Zaznacz cały

if ((tmp=(flags1 & P1))==1)
zmienna tmp zostanie porównana z 1 i jeżeli wartość porównania będzie true - wykona
się to co w klamrach if-a

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 16 wrz 2008, 16:47

Dla większej przejrzystości możesz to zapisac tak:

Kod: Zaznacz cały

tmp=(flags1 & P1)
if(tmp==1)
Jest to dokładnie to samo, tylko mało komu chce się zapisywać to w dwóch linijkach.

hubertp
-
Posty: 25
Rejestracja: 30 paź 2007, 16:01
Lokalizacja: mińsk maz.

Post autor: hubertp » 16 wrz 2008, 17:51

A to nie można zapisać po prostu:

Kod: Zaznacz cały

if ((flags1 & P1)==1)
Jakoś nie wydaje się sensowne użycie tmp :?:

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 16 wrz 2008, 19:03

Można jak najbardziej, ale widocznie autor potrzebował dodatkowo przechowania wartości P1 w zmiennej tmp do innych celów. Sprawdź dalej w programie czy ta zmienna jest gdzieś wykorzystywana.
Prościej można nawet:

Kod: Zaznacz cały

 if(flags1 & P1)

hubertp
-
Posty: 25
Rejestracja: 30 paź 2007, 16:01
Lokalizacja: mińsk maz.

Post autor: hubertp » 16 wrz 2008, 19:31

Nie zmienna tmp nie jest wykorzystywana.Dzięki za pomoc.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 16 wrz 2008, 21:51

Aro pisze: Prościej można nawet:
Kod: if(flags1 & P1)
Tak nie mozna. Prosty przyklad - po wykonaniu operacji (flaga&P1) wychodzi 2. W Twoim kodzie petla if zostnanie wykonana, w kodzia autora programu nie.

ODPOWIEDZ