Herausfinden, ob Zahl im Bereich von-bis liegt (Uhrzeit)

Code sollte schon in der Arduino IDE können.
Wie Mathe geht, weiss ich. ;(

Bei mir compiliert das problemlos Aber macht nichts...

In der 1.8.15 funktionirt das auch NICHT

Die Syntax geht nicht in Arduino.
Also benutzt Du etwas, was nicht Arduino ist.
Vielleicht klärst Du es ja auf, welchen c++ Compiler Du in welcher Umgebung benutzt.
Sonst halte ich das für Trollen - und den eigentlich guten Thread kaputt machen.

:+1: :+1: :+1:

ich hab`s er benutzt ESP Funktioniert nur hat kein Serial definiert un die loop weg gelassen :wink:


constexpr unsigned nachtStart = 19;
constexpr unsigned nachtEnde  = 1;
constexpr unsigned nachtDauer = ((nachtEnde + 24) - nachtStart) % 24; // falls man das nicht selbst rechnen will...

bool nacht(unsigned h)
{
  return (h - nachtStart + 24) % 24 <= nachtDauer;
}

void setup()
{
  Serial.begin(9600);
  while (!Serial) {}
  Serial.printf("Start: %02d:00 \nEnde:  %02d:00 \nDauer: %dh\n\n", nachtStart, nachtEnde, nachtDauer);

  for (unsigned h = 0; h < 24; h++)
  {
    Serial.printf("%02d:00 ist %s\n", h,  nacht(h) ? "nacht" : "tag");
  }
}
void loop() {}
1 Like

Gehts noch? Ich hatte lediglich eine alternative Lösung für die Aufgabe gepostet. Niemand zwingt Dich die zu verwenden oder gut zu finden. Sachen gibts...

Hier eine Version die das Serial.printf durch ein snprintf ersetzt. Dann läufts auch auf den AVRs.

constexpr unsigned nachtStart = 19;
constexpr unsigned nachtEnde  = 1;
constexpr unsigned nachtDauer = ((nachtEnde+24)-nachtStart) % 24;  // falls man das nicht selbst rechnen will...

bool nacht(unsigned h)
{
    return (h - nachtStart + 24) % 24 <= nachtDauer;
}

void setup()
{
    Serial.begin(9600);
    Serial.println("start");
    for (unsigned h = 0; h < 24; h++)
    {  
        char buf[80];
        snprintf(buf,80,"%02d:00 ist %s\n",h,  nacht(h) ? "nacht" : "tag");
        Serial.print(buf);
    }
}

void loop()
{  
}

image

Schönen Abend noch

Teensy, GCC 5.4, Arduino 1.8.15

Warum schreibts nicht das Du am ESP xx kompiliert hast ? dann währe das alles ok

Ja. Ganz gut sogar.

Auch das.

Nachtrag:
Alles kompiliert auf'm Mega.

#10
Der Sketch verwendet 2146 Bytes (0%)
Globale Variablen verwenden 189 Bytes (2%)

#12
Der Sketch verwendet 2168 Bytes (0%)
Globale Variablen verwenden 189 Bytes (2%)

#17
Der Sketch verwendet 2130 Bytes (0%)
Globale Variablen verwenden 188 Bytes (2%)

#27
Der Sketch verwendet 3504 Bytes (1%)
Globale Variablen verwenden 220 Bytes (2%)

Schluß!

Das kommt wen man nicht komplettes Programm zeigt + Umgebung

Irgendwie verstehe ich dein Problem nicht. Gehts Dir jetzt um Speicheroptimierung? Wenn ja, das liegt am snprintf. Nochmal: mir ging es lediglich um die Funktion "nacht(...)" nicht darum wie man auf einem AVR einen c-string möglichst effizient ausgibt.

Aber wenns der Wahrheitsfindung dient: Hier das gleiche nochmal, diesmal mit Deiner Ausgaberoutine:

constexpr byte nachtStart = 19;
constexpr byte nachtEnde  = 1;
constexpr byte nachtDauer = ((nachtEnde + 24) - nachtStart) % 24; // falls man das nicht selbst rechnen will...

bool nacht(byte h)
{
  return (h - nachtStart + 24) % 24 <= nachtDauer;
}

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start"));
  
  for (byte b = 0; b < 24; b++)
  {
    Serial.print(b);
    Serial.print(F(" Es ist "));   
    Serial.println( nacht(b) ? F("Nacht!") : F("Tag!"));
  }
}

void loop(){}

Mega:
Der Sketch verwendet 2220 Bytes (0%)
Globale Variablen verwenden 188 Bytes (2%)

Danke dir @my_xy_projekt .
Jetzt hab auch ich wieder was dazu gelernt.

1 Like

Ich habe kein Problem.
Du wolltest was zeigen - Ja schick.
Wenn der nächste hier mit Assembler kommt...
Vielleicht nochmal an die Zielgruppe denken.
Ich schau auch ab und an bei cplusplus.com vorbei wenn mir mal ne Syntax fehlt und setze das dann Stück für Stück um. Aber nen ganzen Code abzukippen mit den Worten

Dann sollte da auch was bei rauskommen und nicht erst komplett Code umgeschrieben werden.
Schau Dir an, wo wir jetzt sind.

Und ja, es geht auch um Optimierung.
Seit #12 ist das erledigt gewesen. Bis #17 war es Optimierung der Codezeilen.

Im Übrigen hast Du auch noch massives Potential.

Der Sketch verwendet 2108 Bytes (0%) 

Und es liegt nicht am

na denne - es war mir eine Freude, ?: benutzen dürfen.

Noch n' Nachtrag!
Deine Rechnung ist falsch!
Wenn um 1:00 die Nacht ihr Ende hat,

darf da keine Nacht ausgegeben werden.

Es wäre schön, wenn Ausgaben vom SerMon auch in CodeTags eingebettet würden....

Wer nicht lernt ist tot :frowning:

1 Like

Wenn das Nacht-Ende zu 1 Uhr definiert wird, kann man natürlich streiten, ob um genau 1:00 noch Nacht oder schon Tag ist.

Aber wenn man die Dauer richtig zu 6h ausrechnet, aber 7/24 Zeilen "ist Nacht" ausgibt, sollte es einem selbst auffallen, dass da was ist.

Ansonsten halte ich die Wertekombi Start/Dauer statt Start/Ende für nett.
Dank Modulo und einem +24 (für alle Fälle) spart man sich die Fall-Unterscheidungen.
Dass der Controller da mehr zu tun hat als bei ein paar if, ist egal.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.