Arduino Polska Forum
Nieoczekiwane zatrzymanie funkcji - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Nieoczekiwane zatrzymanie funkcji (/watek-nieoczekiwane-zatrzymanie-funkcji)



Nieoczekiwane zatrzymanie funkcji - laudes - 03-02-2017

Dotychczas programowałem w innych językach niż C, więc czegoś tu nie rozumiem.

Jestem wewnątrz funkcji i mam taką sytuację:


Kod:
    Serial.println("1");
      
    if( isTime() == true ){
      Serial.println("go!");
    }

    Serial.println("2");

Funkcja bool isTime() oczywiście zwraca true lub false, ALE powoduje to zatrzymanie funkcji, w której jej wynik jest sprawdzany. Skutkiem jest to, że dwójka nigdy się nie wyświetla. Dlaczego tak jest?


RE: Nieoczekiwane zatrzymanie funkcji - namok - 03-02-2017

Pokaż cały program.


RE: Nieoczekiwane zatrzymanie funkcji - laudes - 03-02-2017

(03-02-2017, 21:06)namok napisał(a): Pokaż cały program.

Kod:
int alarmDaysActive[] = {1, 2, 3, 4, 5};
int daysCount = sizeof(alarmDaysActive);
int alarmHourFrom[] = {7, 20};
int alarmHourTo[] = {16, 50};

int date[7];

void loop() {
    DS1307.getDate(date);

    czujnik();
}

void czujnik(){

  int ruch = digitalRead(ruchPin);
  
  if(ruch == HIGH && isRuch == false){
    czujnikRuchuTime = currTime + czujnikDelay;
    isRuch = true;
    Serial.println("1");
      
    if(isAlarmTime() == true){
      Serial.println("test");
    }

    Serial.println("2");
  }
}

bool isAlarmTime(){
  Serial.println("jest");
  int timeInMinutes = date[4]*60+date[5];
  
  for (int i = 0; i < daysCount; i++) {
    if(alarmDaysActive[i] == date[3]){
      if( (alarmHourFrom[0]*60+alarmHourFrom[1]) >= timeInMinutes
           && (alarmHourTo[0]*60+alarmHourTo[1]) <= timeInMinutes ){
        return true;
      }
    }
  }
  
  return false;
}

pominąłem kilka nieistotnych rzeczy, bo kod jest długi i zawiły.

w każdym razie wiem już, że przyczyną takiego stanu jest kod wewnątrz funkcji isAlarmTime(). jeśli zamiast niego dam return, to działa wszystko poprawnie.


RE: Nieoczekiwane zatrzymanie funkcji - namok - 03-02-2017

Sprawdź na symulatorze: https://www.sites.google.com/site/unoardusim/services


RE: Nieoczekiwane zatrzymanie funkcji - laudes - 03-02-2017

(03-02-2017, 21:33)namok napisał(a): Sprawdź na symulatorze: https://www.sites.google.com/site/unoardusim/services

Już wiem gdzie jest błąd - return true wewnątrz pętli for.
Z jakiegoś powodu powodowało to, że pętla wykonywała się w nieskończoność O_o


RE: Nieoczekiwane zatrzymanie funkcji - namok - 03-02-2017

(03-02-2017, 21:35)laudes napisał(a):
(03-02-2017, 21:33)namok napisał(a): Sprawdź na symulatorze: https://www.sites.google.com/site/unoardusim/services

Już wiem gdzie jest błąd - return true wewnątrz pętli for.
Z jakiegoś powodu powodowało to, że pętla wykonywała się w nieskończoność O_o

I od takich przypadków jest symulator.


Dodaj też nawiasy bo z nawiasami jest tak że lepiej dać więcej niż mniej
Kod PHP:
if( ( (alarmHourFrom[0]*60+alarmHourFrom[1]) >= timeInMinutes )
                   && ( (alarmHourTo[0]*60+alarmHourTo[1]) <= timeInMinutes ) ) 


Jesli fukcja zwraca bool to wystarczy:
Kod PHP:
if(isAlarmTime()) {