Skocz do zawartości

Odniesienie się do konkretnego obiegu pętli for


Pomocna odpowiedź

Napisano (edytowany)
  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
(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

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.

Tyle to ja widzę, a co masz zapisane w argumentach pętli for? 

1 godzinę temu, Philip napisał:

Tak mam w kodzie

Na pewno tak jak napisałem? 

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
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
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

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 

 

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 🙂

 

(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
(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

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ć.

Gość

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.

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