Skocz do zawartości

Czy da się zrobić ifa w pętli while?


bardgang

Pomocna odpowiedź

Założenie mojego programu było takie: jeśli naciśniesz przycisk ma się coś stać a jeśli naciśniesz inny przycisk także, przyciski miały być naciskane po kolei ponieważ inaczej następujące po sobie czynności nie miały zostać wykonane. Program miał być w pętli while i wyglądał tak:

while (digitalRead(40)==HIGH) {}
A niech coś się stanie
  if (digitalRead(44)==HIGH) {}
    niech coś się stanie

Da się wo gule robić coś takiego w pętli? Chciałem podkreślić że niezależnie od tego czy jest tam pętla while czy nie warunek nie chce działać.

Edytowano przez bardgang
Link do komentarza
Share on other sites

51 minut temu, bardgang napisał:

A niech coś się stanie

W pętli while nie dzieje się nic. W skrajnym przypadku program może w niej utknąć, a jak nie utknie to

 

51 minut temu, bardgang napisał:

A niech coś się stanie

Wykona się zawsze. Podobnie z warunkiem if. Przeanalizuj rozmieszczenie swoich nawiasów.

Edytowano przez Belferek
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

@Belferek Jak to w pętli while nie dzieje się nic?

@Cydek Tak mogę sprecyzować, chodziło mi o to że jeśli mamy pętle while a w niej ifa to przykładowo mamy program: jeśli naciśniesz guzik coś ma się stać i to jest pętla a potem if, jeśli naciśniesz guzik też ma sie coś stać. Rzecz w tym że nie zależnie czy przykładowo ten guzik w ifie zostanie naciśnięty czy nie czynność która miała się stać po wciśnięciu guzika w ifie i tak zostanie wykonana.

Link do komentarza
Share on other sites

Niestety nadal nie działa, może to ułatwi sprawę w rozwiązaniu problemu:

  if(klawisz1,2){                                                                                                                                                    
 if (x==0 &&klawisz1 == 'g') { 
  x++;
 } else if (x==1 && klawisz1 == 'a') {
  x++;
  }else if (x==2 && klawisz2 == 'm') { 
  x++;
  }else if(x==3 && klawisz1 =='e'){
 x++; 
 lcd.clear();
  lcd.setCursor(0,0);
lcd.print("Witaj w grze saper");
lcd.setCursor(0,1);
lcd.print("nacisni F1 by zaczac");
while (digitalRead(40)==HIGH) {}
lcd.clear();
lcd.setCursor(5,0);
lcd.print("####");
lcd.setCursor(5,1);
lcd.print("####");
lcd.setCursor(5,2);
lcd.print("####");
lcd.setCursor(5,3);
lcd.print("####");

I TUTAJ MA BYĆ IF TYLKO CZY TAK SIĘ DA?
}
}
}
}

 

Link do komentarza
Share on other sites

@bardgang to ↓ nie ma prawa działać

 if(klawisz1,2){                                                                                                                                                    
 if (x==0 &&klawisz1 == 'g') { 
  x++;
 } else if (x==1 && klawisz1 == 'a') {
  x++;
  }else if (x==2 && klawisz2 == 'm') { 
  x++;
  }else if(x==3 && klawisz1 =='e'){
 x++; 
 lcd.clear();
  lcd.setCursor(0,0);
lcd.print("Witaj w grze saper");
lcd.setCursor(0,1);
lcd.print("nacisni F1 by zaczac");
while (digitalRead(40)==HIGH) {}
lcd.clear();
lcd.setCursor(5,0);
lcd.print("####");
lcd.setCursor(5,1);
lcd.print("####");
lcd.setCursor(5,2);
lcd.print("####");
lcd.setCursor(5,3);
lcd.print("####");

I TUTAJ MA BYĆ IF TYLKO CZY TAK SIĘ DA?
}
}
}
}
 

A to ↓ już tak

 if(klawisz1,2){                                                                                                                                                    
 if (x==0 &&klawisz1 == 'g') { 
  x++;
 } else if (x==1 && klawisz1 == 'a') {
  x++;
  }else if (x==2 && klawisz2 == 'm') { 
  x++;
  }else if(x==3 && klawisz1 =='e'){
 x++; 
 lcd.clear();
  lcd.setCursor(0,0);
lcd.print("Witaj w grze saper");
lcd.setCursor(0,1);
lcd.print("nacisni F1 by zaczac");
while (digitalRead(40)==HIGH) {
lcd.clear();
lcd.setCursor(5,0);
lcd.print("####");
lcd.setCursor(5,1);
lcd.print("####");
lcd.setCursor(5,2);
lcd.print("####");
lcd.setCursor(5,3);
lcd.print("####");

I TUTAJ MA BYĆ IF TYLKO CZY TAK SIĘ DA?
}
}
}
}
 

Przeanalizuj sobie co robisz źle.

Edytowano przez aerograf7
Link do komentarza
Share on other sites

Noi sobie tak analizuje @aerograf7 i mi wyszło że nic nie zmieniłeś. 

 

 

 

 

 

@SOYER Ok uzasadnię co się według mnie dzieje w tej pętli while i po co to jest, otóż po naciśnięciu guziku na pinie 40 na ekranie lcd wyświetlić się ma coś takiego:

####

####

####

####

A po to to jest ponieważ kiedy napisałem normalnego ifa wskazywało na błąd, teraz kiedy chcę zrobić ifa w tej pętli nie wskazuje na błąd jednak if ten jest wykonywany zanim użytkownik naciśnie guzik a tak nakazuje ten warunek.

  • Nie zgadzam się! 1
Link do komentarza
Share on other sites

Najestetyczniej i najczytelniej jest w taki sposób:

while(jakiś warunek)
{
  rób coś tam;
  while(jakiś warunek)
  {
    rób jeszcze coś innego;
  }
}

Możliwe, że chodzi o te nawiasy. Natomiast jak widzę coś takiego:

while(warunek){
  rób coś;
}while(warunek){
  rób coś;
}

to dostaje drgawek. Proszę tak nie robić, bo z tego się robią same problemy. Tym bardziej coś takiego:

while(warunek){}
rób coś;

Pamiętaj, że ciało pętli (czyli to co ma się wykonać pod jakimś warunkiem) MUSI (x3) być w klamrach. Inaczej stanie się tak jak pisałeś wcześniej, czyli pętla wykona się raz i nie ważne czy guzik będzie wciśnięty czy nie.

Pozdrawiam

Edytowano przez Cydek
poprawa informacji
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.