Mein erster OOP versuch

JA, da gebe ich euch recht.
Wahrscheinlich hängt mir das immer noch nach, Speichersparend zu programmieren.
mein letztes größeres Projekt hatte zum Schluß 1,4GB komprimierten Code.
keine Ahnung wie groß es geworden wäre, wenn wir auf solch Sachen nicht geachtet hätten.

Es ist nicht gesagt , dass ein

void start() { if (activ){startTime = millis(); }
void stop() { activ = false; }

wirklich so viel mehr Speicherplatz verbraucht...

Natürlich nicht!
das ist eine Funktion von vielen!
Der Sourcecode war damals fast 7GB groß, davon etwa 1GB Kommentare.
Wir mußten auf speicher achten und auch auf laufzeiten.
Bei heutigen Rechnern ist das lange nicht mehr so wichtig!
Wie gesagt MIR hängt das noch nach!
Habe jetzt start und stop implementiert

Mir ist egal wo die Dinger stecken.
Oben unten, links rechts.... egal.

void onTimer(Action func_)
{                     
      func_ = func;
 }

2 "fast" gleichlautende Bezeichner, nur unscheinbar anders.
Schnell sind sie vertauscht. Leicht zu übersehen

Hier ist dann klar und deutlich zu erkennen, was gemeint ist.

void onTimer(Action func)
{                     
      this->func = func;
 }

Man muss sich schon anstrengen, um sich hier zu irren, bzw. einen Irrtum zu übersehen.

wenn man seine Funktionen und Variablen möglichst unsprechend benennt dann brauch man sicherlich sehr viele Kommentare für die Kolleg:innen.

DuckUndWeg

:wink:

:joy:
Was meinst du warum fast ein viertel nur Kommentare waren :see_no_evil:
die werden ja nicht mit-Kompiliert :joy: :rofl: :joy:


```cpp
/*
Programm	Einfache Timerklasse
Name	    Jörg ter Veen
Kontakt	  joerg.ter.veen@icloud.com
Datum	    13.03.2024
Version	  1.1.0.4

Danke an das Arduino-Forum mit unterstützung von:
  - noiasca
  - Kai-R
  - MicroBahner
  - combie
*/
  class TTimer {		

    private:
      unsigned long period;
      unsigned long startTime;
      bool activ = false;
      using action = void (*)();
      action func{nullptr};

  	public:
      void start(){                                       // Timer starten
        activ = true;
        startTime = millis();
      }

      void stop(){                                        // Timer Stoppen
        activ = false;
      }

      void setTOcallback(action val){                     // Funktion übergeben die aufgerufen werden soll
        func = val;
      }

      void setInterval(unsigned long val){                // Intervall der Timer
        period = val;
      }

      void update(){
        if ((activ)&&(func)){                             // Nur nach kompletter integration
          if  (millis() - startTime >= period) {
            startTime = millis();
            func();                                       // hier Function aufrufen
          }
        }
      }
  };

bool toggle;
TTimer myTimer;
const byte ledPin = 7;

void setup() {
  pinMode(ledPin, OUTPUT);
  myTimer.setInterval(1000);
  myTimer.setTOcallback(blinken);
  myTimer.start(); 
}

void loop() {
  myTimer.update();
}

void blinken(){
  toggle = !toggle;
  digitalWrite(ledPin, toggle);
}

Ja mit der Klarheit gebe ich Dir recht. Ist halt mehr zu tippen :wink: . Beim Vertauschen meckert der Compiler ...

Der folgende Unterstrich wird halt oft in Lehrbüchern verwendet... Selbst beim C++ Programmierer bekommt man das so gezeigt.

Bei unserem Projekt war es z.B. so:
TTimer Groß T für Klasse
myTimer kkleiner Anfang "abgeleitet"
mit dem Befehl with myTimer brauchte man die abgeleitete Klasse nicht mehr Schreiben, deshalb ansatt myTimer.setInterval
setTimer = 500 oder aktivTimer = true
das sind halt unterschiede zwischen Pascal und C
daran muß ich mich erst gewöhnen

C++

Und damit ich auch was Konstruktives schreibe:
Mit STRG-T in der IDE kannst du die Formatierung deines Codes verbessern.

danke, hat sich aber nichts verändert ...

Letztendlich kannst Du das machen wie Du willst, solange der Quellcode syntaktisch korrekt ist.
Allerdings ist es schon besser die üblichen Konventionen einer Sprache zu übernehmen, wenn man den Quellcode nicht nur für sich persönlich verwendet.

Sie sind ja nicht ohne Grund entstanden und erleichtern halt die Verständlichkeit. Manche schützen einen auch vor sich selbst und verhindern Flüchtigkeitsfehler. Wobei es in Details immer Variationen geben wird. Es sind ja nur Empfehlungen ...

aber ganz bestimmt ändert der Formatter mit STRG-T etwas:

/*
  Programm  Einfache Timerklasse
  Name      Jörg ter Veen
  Kontakt   joerg.ter.veen@icloud.com
  Datum     13.03.2024
  Version   1.1.0.4

  Danke an das Arduino-Forum mit unterstützung von:
  - noiasca
  - Kai-R
  - MicroBahner
  - combie
*/
class TTimer {

  private:
    unsigned long period;
    unsigned long startTime;
    bool activ = false;
    using action = void (*)();
    action func{nullptr};

  public:
    void start() {                                      // Timer starten
      activ = true;
      startTime = millis();
    }

    void stop() {                                       // Timer Stoppen
      activ = false;
    }

    void setTOcallback(action val) {                    // Funktion übergeben die aufgerufen werden soll
      func = val;
    }

    void setInterval(unsigned long val) {               // Intervall der Timer
      period = val;
    }

    void update() {
      if ((activ) && (func)) {                          // Nur nach kompletter integration
        if  (millis() - startTime >= period) {
          startTime = millis();
          func();                                       // hier Function aufrufen
        }
      }
    }
};

bool toggle;
TTimer myTimer;
const byte ledPin = 7;

void setup() {
  pinMode(ledPin, OUTPUT);
  myTimer.setInterval(1000);
  myTimer.setTOcallback(blinken);
  myTimer.start();
}

void loop() {
  myTimer.update();
}

void blinken() {
  toggle = !toggle;
  digitalWrite(ledPin, toggle);
}

oberste Klammerebene ist jetzt auf 0.
blanks vor {
...

und weil ich es gerade sehe:

warum hast du activ und func in Klammern gesetzt?

Bin ich ganz bei dir!
Ich bemühe mich die Konventionen zu berücksichtigen!
hoffe wir lesen uns bei zukünftigen Projekten!
bislang gefällt es mir hier sehr gut

eigentlich zur übersicht.
so sieht man auf anhieb das es zwei "if"abfragen sind.
Mir war die &&-Klausel nicht geläufig, sie scheint aber in C++ gängig zu sein.
Deshalb wären sie überflüssig und wenn ich mich daran gewöhnt habe, lasse ich sie bestimmt weg

PS: Ja, ich muss noch sehr viel lernen!

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