Wpis z mikrobloga

Czy ta reguła jest poprawna? Programuję ESP8266 i mam wrażenie, że czasem nie zwraca true, choć warunek jest prawdziwy. Chodzi mi m.in. czy nie trzeba wprowadzić jakichś dodatkowych nawiasów i czy można pisać + 6 przy znaku && (czy nie trzeba nawiasów. Dziś miałem wrażenie, że kod się zaciął, ale nie miałem go jak zdebugować, ale to musi być raczej ta linijka.

#arduino #esp8266 #esp32 #mikrokontrolery #jezykc #c++ #programowanie
  • 26
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Generalnie g---o prawda


@Turbojurek: @MisiekD Ogólnie problem wydaje mi się, że występował w kompilatorze arduino.

Ja teraz sprawdziłem jak to wygląda w Delphi i C++ builderze. W Delphi (no czyli w pascalu) lewa i prawa strona warunków AND i OR musi być zamknięta w nawiasy, inaczej kompilator wyrzuca errory i nie kompiluje. W C++Builderze nie musi tak być i tak jak jest napisany warunek, działa prawidłowo po podstawieniu wartości
  • Odpowiedz
via Android
  • 0
@stivenus a co rozumiesz przez przepełnienie funkcji? Program pisałem sam, ale pierwszy raz mam tak głupi problem. Logi mam, temperatury mierzą się wszystkie dobrze. Jeszcze chyba dorobię panel logujący wszystkie zmienne. Generalnie to ESP działa, mogę nim sterować. Ale nie sprawdzałem czy jestem w stanie ponownie włączyć pompy obiegowe przez WiFi. Oby problem nie siedział w komunikacji I2C, ale mam wrażenie, że jak przyciski po I2C działają to nie ma żadnego
  • Odpowiedz
a co rozumiesz przez przepełnienie funkcji?


@MisiekD: Przepełnienie zmiennej. Różne typy danych mają różne zakresy. Na przykład int w arduino ma od -32 768 do 32 767. Jak do zmiennej typu int, która będzie miała wartość 32 767 dodasz 1, to nie będzie 32 768, tylko ona się przepełni i będzie miała najmniejszą wartość ze swojego zakresu, czyli -32 768, tak jakby się "resetuje".
  • Odpowiedz
  • 0
@stivenus: Ah okej, to tak, to biorę zawsze pod uwagę i to na pewno się nie dzieje.
Jedyne co mnie jeszcze może nurtować to jak odbywa się to dodawanie wartości w powyższym if-ie.

Bo mam regułę:

if ((temperaturaPiecCO2 >= temperaturaBufor1 + 6 && temperaturaPiecCO2 >= 50) || temperaturaPiecCO1
  • Odpowiedz
zmienna temperaturaBufor1 jest typu float, a ja dodaję do niej 6 (a ta 6 jest int) i czy to może jakoś nie koliduje


@MisiekD: Nie, to nie przeszkadza. Ale możesz też to zapisać jako + 6.0.

W pętlach z czasem millis() nauczyłem się dawać UL, ale czy tak ma być - nie
  • Odpowiedz
@MisiekD: Składniki dodawania zostaną rzutowane na float, potem przy porównaniu również oba będą rzutowane na float. Potem wynikiem porównania jest już bool. Ponieważ masz >= (a nie na przykład ==) to ewentualne błędy zmiennoprzecinkowe nie będą miały znaczenia.
Jeśli nie wiesz o co chodzi z błędami floata, to dodaj np. w konsoli javascript w przeglądarce 0.1 + 0.2.
Podsumowując: tu też wszystko ok.
  • Odpowiedz