Skocz do zawartości

Problem i pytanie odnośnie Bool ?


ampers

Pomocna odpowiedź

Mam taki wiersz:

bool stanPompyCwu = (!stanPompyCwu && czCWUdol < (tempCWUminimalna - 3.0)) || (stanPompyCwu && czCWUdol < tempCWUminimalna);

Chodzi mi o stworzenie histerezy 3 stopnie. I mam problem, bo nie działa jak zaplanowałem :). A mianowicie gdy tempCWUminimalna spadnie poniżej 37 to faktycznie pompka się włącza i zaczyna się grzanie i powinna się wyłączyć gdy osiągnie czCWUdol 40 lub więcej. Ale jakimś dziwnym trafem się wyłącza gdy osiągnie 37. Co jest tego powodem jak by nie widział drugiej cześci po ||  ? czy może jest tak że bool może sprawdzać tylko jeden warunek ?

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, ampers napisał:
bool stanPompyCwu = (!stanPompyCwu && czCWUdol < (tempCWUminimalna - 3.0)) || (stanPompyCwu && czCWUdol < tempCWUminimalna);

powinna się wyłączyć gdy osiągnie czCWUdol 40 lub więcej.

A gdzie sprawdzasz, że czCWUdol wynosi 40 LUB WIĘCEJ? 🤔🙂

Link do komentarza
Share on other sites

7 minut temu, ReniferRudolf napisał:

A gdzie sprawdzasz, że czCWUdol wynosi 40 LUB WIĘCEJ? 🤔🙂

(stanPompyCwu && czCWUdol < tempCWUminimalna);

Tutaj sprawdzam czy czCWUdol < tempCWUminimalna

czCWUdol - czujnik temperatury

tempCWUminimalna = 40

Link do komentarza
Share on other sites

Niepotrzebnie ta skrócona składnia.

if (temp < min) {
  wlacz();
}
if (temp > max) {
  wylacz();
}

A jeśli chcesz to jednej linii to chyba na zasadzie
stanPompyCwu = (tempCWUdol < (tempCWUminimalna - 3)) ? false : (tempCWUdol > (tempCWUminimalna + 3)) ? true : stanPompyCwu;

stanPompyCwu = (tempCWUdol < (tempCWUminimalna - 3)) ? true : (tempCWUdol > tempCWUminimalna) ? false : stanPompyCwu;

Czyli trzeba brać pod uwagę 3 warunki:

  • temp poniżej - włącz
  • powyżej - wyłącz
  • w zakresie histerezy - nie zmieniaj
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)
29 minut temu, etet100 napisał:
stanPompyCwu = (tempCWUdol < (tempCWUminimalna - 3)) ? true : (tempCWUdol > tempCWUminimalna) ? false : stanPompyCwu;

 

Idealnie Działa tak jak chciałem ogromne dziękuje. Tak chcę unikać if za każdym razem przy kilku zmiennych warunkach już by mi kod zaciemniało a tak to mam jedno pod drugim łatwo to ogarnąć. Ale nie daje mi spokoju czemu nie działa ten bool w takiej składni:

bool stan = (cos1 &&  cos2  <  cos2)

Teoretycznie wszystko się kompiluje poprawnie, a jednak działanie jest inne niż oczekiwania. Czy może funkcja bool może sprawdzać tylko jeden warunek logiczny ? jak to jest ?

Edytowano przez ampers
Link do komentarza
Share on other sites

50 minut temu, ampers napisał:

Idealnie Działa tak jak chciałem ogromne dziękuje. Tak chcę unikać if za każdym razem przy kilku zmiennych warunkach już by mi kod zaciemniało a tak to mam jedno pod drugim łatwo to ogarnąć. Ale nie daje mi spokoju czemu nie działa ten bool w takiej składni:

bool stan = (cos1 &&  cos2  <  cos2)

Teoretycznie wszystko się kompiluje poprawnie, a jednak działanie jest inne niż oczekiwania. Czy może funkcja bool może sprawdzać tylko jeden warunek logiczny ? jak to jest ?

Spróbuj dołożyć nawiasów.

bool stan = (cos1 && (cos2< cos3))

Powinno działać.

Edytowano przez SOYER
Link do komentarza
Share on other sites

2 godziny temu, SOYER napisał:

bool stanPompyCwu = ((!stanPompyCwu && (czCWUdol< (tempCWUminimalna - 3.0))) || (stanPompyCwu && (czCWUdol < tempCWUminimalna)));

Dołożyłem kolejny komplet nawiasów teraz, bo jeszcze brakowało. Teraz na pewno jest komplet.

Nie zagłębiałem się w logikę tego zapisu, tylko mi od pierwszego wejrzenia brakowało w tym wszystkim nawiasów.

Edytowano przez SOYER
Link do komentarza
Share on other sites

W języku C operatory porównania (<, >, itd.) mają przy obliczaniu wyrażenia wyższy priorytet niż operatory logiczne (&&, ||) dlatego takie dwa zapisy dadzą identyczny wynik:

bool stan = (cos1 &&  cos2  <  cos3)

bool stan = (cos1 &&  (cos2  <  cos3))

Nawiasów warto użyć (byle nie w nadmiarze) dla zwiększenia czytelności kodu, natomiast na działanie programu w tym przykładzie to nie wpłynie.

Link do komentarza
Share on other sites

4 godziny temu, ampers napisał:

Tak chcę unikać if za każdym razem przy kilku zmiennych warunkach już by mi kod zaciemniało a tak to mam jedno pod drugim łatwo to ogarnąć.

Właśnie tego typu zagnieżdzone ? zaciemniają. Ify są czytelne. W tym przypadku dobitnie to widać.

 

4 godziny temu, ampers napisał:

Czy może funkcja bool może sprawdzać tylko jeden warunek logiczny ? jak to jest ?

Bool to jest typ zmiennej a nie funkcja. Natomiast z tej instrukcji warunkowej wykonywane jest tyle ile potrzeba aby ocenić jej wynik.

Jeśli masz:

bool a = false;
bool b = true;
bool c = a == true && b == true;

To sprawdzane jest czy a == true ale nie ma sensu już sprawdzać czy b == true. Z pierwszego sprawdzenia wynika już wynik całości.

Przy czym to w praktyce nie powoduje takich problemów o jakich tu mówisz. Te problemy to na 99.9% błędu w kodzie a nie problemów wynikających z tego typu optymalizacji wykonania. Jeśli logika jest poprawnie opisana kodem to będzie działało.

Edytowano przez etet100
Link do komentarza
Share on other sites

14 minut temu, ReniferRudolf napisał:

W języku C operatory porównania (<, >, itd.) mają przy obliczaniu wyrażenia wyższy priorytet niż operatory logiczne (&&, ||) dlatego takie dwa zapisy dadzą identyczny wynik:

bool stan = (cos1 &&  cos2  <  cos3)

bool stan = (cos1 &&  (cos2  <  cos3))

Nawiasów warto użyć (byle nie w nadmiarze) dla zwiększenia czytelności kodu, natomiast na działanie programu w tym przykładzie to nie wpłynie.

Z całą pewnością masz rację, jednak już wielokrotnie przekonałem się, że takie dodanie nawiasu jednak wpłynęło na działanie softu. Nie wiem czy ma coś z tym wspólnego arduino IDE. Musiałbym zapytać @ethanak.

Link do komentarza
Share on other sites

1 minutę temu, SOYER napisał:

Nie wiem czy ma coś z tym wspólnego arduino IDE

Nie, nawiast są elementem języka (czyli w tym przypadku C++).

Aha, tak przy okazji: 

4 godziny temu, ampers napisał:

Czy może funkcja bool może sprawdzać tylko jeden warunek logiczny ?

Pytanie nie ma sensu, bo bool nie jest funkcją a typem zmiennej i w związku z tym nic nie sprawdza. Równie dobrze mógłbyś tam dać int - będzie działać identycznie.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.