Skocz do zawartości

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


bardgang

Pomocna odpowiedź

1 godzinę temu, Cydek napisał:

Pamiętaj, że ciało pętli (czyli to co ma się wykonać pod jakimś warunkiem) MUSI (x3) być w klamrach

Jeżeli to ciało liczy sobie klika instrukcji stanowiących blok. Dla pojedynczej instrukcji nawiasy {} są zbędne.

Link do komentarza
Share on other sites

8 minut temu, Belferek napisał:

Jeżeli to ciało liczy sobie klika instrukcji stanowiących blok. Dla pojedynczej instrukcji nawiasy {} są zbędne.

Moim zdaniem lepiej jest sobie od razu wyrabiać nawyk wstawiania klamr. Na samym początku piszemy proste instrukcje z jedną linijką kodu. Robimy powiedzmy kilkadziesiąt takich instrukcji dla "poćwiczenia". Potem bierzemy się za coś trudniejszego (czyt. więcej linijek w instrukcji) i nagle mamy pierdyliard błędów o klamry, bo oczywiście nie postawiliśmy ich z przyzwyczajenia. Oczywiście, jeżeli potem już lepiej rozumiemy istotę programowania, możemy sobie pozwolić na takie rzeczy jak nie stawianie klamr po instrukcjach warunkowych z jednolinijkowym ciałem.

Link do komentarza
Share on other sites

11 minut temu, Cydek napisał:

Moim zdaniem lepiej jest sobie od razu wyrabiać nawyk wstawiania klamr.

To nie chodzi o nawyk, tylko o świadome ich stosowanie. Kiedy piszesz program to przecież nie metodą chybił trafił? Nie ważne czy program ma 100 linii kodu czy 1000, nie ważne moim zdaniem czy stawiasz pierwsze kroki czy piszesz, któryś tam program z rzędu. Należy być świadomym co się robi, a wtedy nie będą się pojawiać bezsensowne pytania typu "Czy da się zrobić ifa w pętli while?"

Najpierw trzeba poczytać o warunku if, o pętli while i nawiasach klamrowych, a dopiero później brać się za tworzenie programu.

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

Tak wam powiem , że czytam odpowiedzi i mam mieszane odczucia (wykluczam @Gieneq , który zaproponował coś konkretnego) . Nie rozumiem też dlaczego @bardgang dostał minusa. W zasadzie to sam mam pytanie. Załóżmy taką sytuację: uruchamiacie jakieś peryferia niech to będzie RTC. Załóżmy , że pierwszy krok to podłączenie zegara do RTC. Po tym kroku zostaje automatycznie (przez hardware) ustawiona flaga synchronizacji  w rejestrze kontrolnym RTC. W/w flaga zostanie skasowana automatycznie (również przez hardware) po x cykli zegara. Czyli , żeby przejść do kolejnego etapu konfiguracji RTC trzeba odczekać te x cykli zegara. I teraz moje pytanie: Do dyspozycji mamy pętlę while() oraz funkcje np. rtcSynchro(); która zwraca 1 jeśli RTC jest w trakcie synchronizacji lub 0 jeśli RTC został zsynchronizowany. Jak to zapisać?

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

Może się nie znam ale większość urządzeń peryferyjnych uruchamiamy i konfigurujemy w setup() więc tu nawet delay() nie zaszkodzi zbytnio. No ale jeśli to ma się dziać w pętli while to może tak: while( !rtcSynchro() );

Edytowano przez Belferek
Link do komentarza
Share on other sites

30 minut temu, slon napisał:

Do dyspozycji mamy pętlę while() oraz funkcje np. rtcSynchro(); która zwraca 1 jeśli RTC jest w trakcie synchronizacji lub 0 jeśli RTC został zsynchronizowany. Jak to zapisać?

W Arduino/Wiring? Załadam, że mimo że zegar nie został zsynchronizowany maszynka robi coś pożytecznego
 

void loop(void)
{
    coś_pożytecznego();
    if (!rtcSynchro()) obsługa_zegarka();
}

A do while moim zdaniem trzeba dorosnąć 😉

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

4 godziny temu, Belferek napisał:

większość urządzeń peryferyjnych uruchamiamy i konfigurujemy w setup() więc tu nawet delay() nie zaszkodzi zbytnio.

Ok zgadzam się. Czy w takim razie można to tak zapisać?

void main(void) 
{
 podłącz_zegar_do_rtc();
 while(rtcSynchro()) {}
 ustaw_czas();
  while(1) 
  {
    
  }
  
}

 

4 godziny temu, ethanak napisał:

W Arduino/Wiring?

Osobiście myślałem o stm8.

Link do komentarza
Share on other sites

21 minut temu, Belferek napisał:

A gdzie zjadłeś " ! ", o którym pisałem?

 

6 godzin temu, slon napisał:

rtcSynchro(); która zwraca 1 jeśli RTC jest w trakcie synchronizacji lub 0 jeśli RTC został zsynchronizowany

Coś mi się wydaje że kolega @Belferek miał o jeden wykrzyknik za dużo 😉

 

35 minut temu, slon napisał:

Osobiście myślałem o stm8.

Jedna chwała - i tak masz główną pętlę (tyle że jawną) i żadnej innej. Na przykład:

void main(void) 
{
   podłącz_zegar_do_rtc();
   while(1) 
   {
      rób_coś mądrego_do_czego_nie_potrzeba _zegarka();
      if (!rtcSynchro()) {
        ustaw_czas_jeśli_nie_był_ustawiony();
        rób_coś_innego_co_czego_potrzebny_zegarek();
      }
   }
}

Przydaje się do okresowej synchronizacji np. z ntp.

Link do komentarza
Share on other sites

7 minut temu, ethanak napisał:

Coś mi się wydaje że kolega @Belferek miał o jeden wykrzyknik za dużo

Jakieś dziwne myśli nie związane z tematem chodzą Ci po głowie - bez sensu

Piszesz:

if (!rtcSynchro()) ......

Ja piszę o:

while(!rtcSynchro()) {}

Więc piszemy o tym samym, o warunku, który by osiągnąć jego odpowiednie działanie (dla tej funkcji o której mówi slon) należy za pomocą "!" zanegować i tyle

Edytowano przez Belferek
Link do komentarza
Share on other sites

@Belferek tyle że rtcSynchro zwraca 1 jeśli nie jest zsynchronizowany, czyli Twoja pętla po przełożeniu na język naturalny będzie:

dopóki zegarek jest zsynchronizowany poczekaj, aż przestanie

Jesteś pewien że o to Ci chodziło? Że na pewno nie miałeś za dużo o jeden wykrzyknik?

Z czystej ciekawości chciałbym wiedzieć, o co Ci chodziło gdy pisałeś

4 minuty temu, Belferek napisał:

Jakieś dziwne myśli nie związane z tematem chodzą Ci po głowie - bez sensu

Poza tym:

4 minuty temu, Belferek napisał:

Więc piszemy o tym samym, o warunku,

Gó^Huzik prawda.

 

Link do komentarza
Share on other sites

Wyjaśniłem to wcześniej. Różni się tym, że w Twoim przypadku jest zastosowany błędnie. Nie dyskutowałbym bo nie ma o czym gdybyś się do kolegi nie doczepił o brak niepotrzebnego wykrzyknika.

Zrozumiałeś wreszcie?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzięki  @ethanak. @Belferekz twoim wykrzyknikiem ustawił bym niepoprawny czas na skutek braku synchronizacji. Dodatkowo pewnie sfiksował by pewnie LCD , który jest napędzany z LSE ale mniejsza o to. Wróćmy do arduino i pierwszego posta. Weźmy taki kod :

// przycisk do gnd

#define przycisk 2
#define led 13

void setup() 
{
  pinMode(przycisk, INPUT_PULLUP);
  pinMode(led,OUTPUT);
  while(digitalRead(przycisk));
  digitalWrite(led,HIGH);
}

@Belferek możesz mi napisać dlaczego chcesz wstawić ! przed digitalRead(przycisk) ? Drgania styków pomińmy.

Link do komentarza
Share on other sites

58 minut temu, slon napisał:

możesz mi napisać dlaczego chcesz wstawić ! przed digitalRead(przycisk) ? Drgania styków pomińmy.

Matko..., albo mnie ten covid tak męczy albo ślepnę i nie widzę - gdzie coś takiego pisałem?

 

8 godzin temu, slon napisał:

Czyli , żeby przejść do kolejnego etapu konfiguracji RTC trzeba odczekać te x cykli zegara. I teraz moje pytanie: Do dyspozycji mamy pętlę while() oraz funkcje np. rtcSynchro(); która zwraca 1 jeśli RTC jest w trakcie synchronizacji lub 0 jeśli RTC został zsynchronizowany. Jak to zapisać?

To fragment  Twojej pierwszej wypowiedzi, w której rzucasz problem, który odczytuję jako "Mam do dyspozycji while() i jakąś tam funkcję rtcSynchro(); Jak za pomocą while odczekać, aż funkcja zwróci 0? Ciesz się, że są magicy jak ethanak, którzy czytają pomiędzy słowami i czytają nawet to czego pytający nie napisał.

 

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