Cześć!
Programuję AT90CAN128 (ale tu nie o model mikrokontrolera chodzi) i natrafiłem na problem z kolejnością wykonywania operacji. Nie mam tak dużej wiedzy żeby stwierdzić, że to błąd kompilatora, ale sprawa jest dla mnie dziwna.
W programie mam fragment kodu:Niby nic skomplikowanego, ale nie wykonuje się zgodnie z moimi oczekiwaniami. Ja spodziewałem się, że najpierw zostanie odczytany stan pinów portu B, następnie odczytany bajt będzie w całości zanegowany, a na końcu przesunięty w prawo o 4 bity. Tymczasem tak nie jest. Po odczycie wykonywane jest przesunięcie w prawo, a na koniec wynik zostaje zanegowany. Wtedy jednak wynik jest inny niż oczekiwany. Widać to w asemblerze:Zapisałem to inaczej:ale wynik kompilacji jest identyczny.
Dopiero zapis:wygenerował to, czego się spodziwałem, czyli:
To co opisałem kompilowałem 4 kompilatorami: MHV AVR Tools 20121007, Atmel AVR Toolchain 3.4.1, Atmel AVR Toolchain 3.2.3 i starym WinAVR-20100110. W każdym przypadku zjawisko wygląda tak samo.
Wg mnie pierwszy przykład, nawet całkowicie pozbawiony nawiasów, powinien się skompilować jak przypuszczałem (priorytety operatorów), a jednak tak nie jest. Dodałem nawiasy i zadziwił mnie brak zmiany w wyniku kompilacji.
Uświadomcie mnie, kto i gdzie się myli? Ja czy kompilator?
Programuję AT90CAN128 (ale tu nie o model mikrokontrolera chodzi) i natrafiłem na problem z kolejnością wykonywania operacji. Nie mam tak dużej wiedzy żeby stwierdzić, że to błąd kompilatora, ale sprawa jest dla mnie dziwna.
W programie mam fragment kodu:
Kod: C / C++
Kod: text
Kod: C / C++
Dopiero zapis:
Kod: C / C++
Kod: text
To co opisałem kompilowałem 4 kompilatorami: MHV AVR Tools 20121007, Atmel AVR Toolchain 3.4.1, Atmel AVR Toolchain 3.2.3 i starym WinAVR-20100110. W każdym przypadku zjawisko wygląda tak samo.
Wg mnie pierwszy przykład, nawet całkowicie pozbawiony nawiasów, powinien się skompilować jak przypuszczałem (priorytety operatorów), a jednak tak nie jest. Dodałem nawiasy i zadziwił mnie brak zmiany w wyniku kompilacji.
Uświadomcie mnie, kto i gdzie się myli? Ja czy kompilator?
