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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.