Skocz do zawartości

Odniesienie się do konkretnego obiegu pętli for


Philip

Pomocna odpowiedź

  case alarm1:
int t;
    for(t=0;t<=6;t++){
  if(aktualnyCzas - zapamietanyCzas == 1000UL){
    zapamietanyCzas = aktualnyCzas;
    state = !state;
    digitalWrite(BUZZER,state);
    } 
   }
   if(t==6){
   stan = stopAlarm;
   }
  break;

Witam,

Mam taki fragment kodu na Arduino. Program cały czas pozostaje w pętli for. Jak powołać się na konkretny jej obieg, aby z niej wyjść? Jest do tego może jakaś funkcja? Przeczuwam, że rozwiązanie problemu jest banalnie proste. 😁

Pozdrawiam

 

Edytowano przez Philip
Link do komentarza
Share on other sites

(edytowany)
17 minut temu, Philip napisał:

Jak powołać się na konkretny jej obieg, aby z niej wyjść?

np. tak

if(t==5) w odpowiednim miejscu 

Edytowano przez SOYER
Link do komentarza
Share on other sites

Tyle to ja wiem. 😉 Tak mam w kodzie, ale pętla odtwarza się ponownie i ponownie, bo nic jej nie przerywa. Program nie reaguje na ten warunek.

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

do przerwania pracy pętli służy instrukcja "break", więc wewnątrz pętli możesz dodać linijkę "If(warunek) break;"

Twoja pętla wykonuje się 7 razy. Warunek if(t==6) zawsze będzie prawdziwy, ponieważ z taką wartością pętla kończy pracę.

Podejrzewam, że wydaje Ci się że pętla wykonuje się cały czas, ponieważ program w kółko do niej wraca, np. za sprawą głównej pętli programu.

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

18 minut temu, Hudyvolt napisał:

Twoja pętla wykonuje się 7 razy. Warunek if(t==6) zawsze będzie prawdziwy, ponieważ z taką wartością pętla kończy pracę.

Właśnie ten warunek raczej nigdy nie będzie prawdziwy... i dlatego program wchodzi do pętli for od nowa. Powinno być if (t==7), albo i zupełnie bez tego if-a.

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

48 minut temu, Hudyvolt napisał:

break

To ja wiem i próbowałem również tego.

49 minut temu, Hudyvolt napisał:

za sprawą głównej pętli programu.

Tak się właśnie dzieje. 

To jest jeden z case'ów i program się na nim zatrzymuje. Spróbuję dziś wieczorem tak zrobić @Elvis

Link do komentarza
Share on other sites

Dnia 3.05.2020 o 18:27, Philip napisał:

for(t=0;t<=6;t++){

chłopaki, kiedy t będzie się równało 7 ???

 

32 minuty temu, ethanak napisał:

umieszczam warunek w środku tej pętli, a nie metr dalej...

To właśnie napisałem

Dnia 3.05.2020 o 18:44, SOYER napisał:

if(t==5) w odpowiednim miejscu 

 

Link do komentarza
Share on other sites

2 minuty temu, SOYER napisał:

chłopaki, kiedy t będzie się równało 7 ???

Po wyjściu z pętli. Jako praca domowa: przeczytać jak działa instrukcja for.

2 minuty temu, SOYER napisał:

To właśnie napisałem

Ale ja napisałem bardziej dosłownie 🙂

 

Link do komentarza
Share on other sites

(edytowany)

Prawdopodobnie całe nieporozumienie wzięło się z warunku w pętli:

for(t=0;t<=6;t++){
  

Jak słusznie zauważył kolega @Hudyvolt, taka pętla wykona się 7 razy, za pierwszym razem t=0, a za ostatnim t=6, czyli t=0,1,2,3,4,5,6 daje razem 7. Powodem tego zamieszania jest użycie warunku <= (mniejszy-równy), popularniejsze jest używanie ostrej nierówności, czyli kodu:

for(t=0;t<6;t++){
  

Domyślam się, że o to chodziło autorowi tematu i taka postać jest używana znacznie częściej. Pętla chyba miała się wykonać 6 razy, czyli t=0,1,2,3,4,5 i wówczas po wyjściu z pętli wartość t wynosiłaby 6, a więc oryginalny warunek byłby spełniony.

Edytowano przez Elvis
Link do komentarza
Share on other sites

(edytowany)
15 minut temu, SOYER napisał:

for(t=0;t<=6;t++){

wydawało mi się, że pętla wykona się tylko 6 razy, źle mi się wydawało? Wykonuje się do <6, czy do ==6?

Mniejszy i równy 6, czy mniejszy lub równy 6?

Edytowano przez SOYER
Link do komentarza
Share on other sites

Drodzy Panowie ten fragment kodu jest dobry, ale coś innego musi powodować zapętlanie się tej pętli for. Program też dziwnie wchodzi z długim opóźnieniem w ten stan "alarm1"🤔 a tak nie powinno być.

Link do komentarza
Share on other sites

Anonim

To może spróbuj zainstalować sobie Atmel Stuio i wklej w nie sobie ten feralny fragment kodu, włącz symulator i sprawdź co się dzieje z wykonywaniem programu krok po kroku to na pewno znajdziesz przyczynę złego działania dobrego kodu. Z doświadczenia wiem, że na ogół działanie jest dobre tylko kod jest złyyyy.  ;D

IMHO do każdego programu powinno się włączać jakiś debuger, wtedy nikt by nie maił wątpliwości czy dany program jest wykonywany zgodnie z naszą wolą czy może kod jest jednak zły.

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.