• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Nieoczekiwane zatrzymanie funkcji
#1
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?
 
Odpowiedź
#2
Pokaż cały program.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
(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.
 
Odpowiedź
#4
Sprawdź na symulatorze: https://www.sites.google.com/site/unoardusim/services
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
(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
 
Odpowiedź
#6
(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()) {


Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości