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
![]()
![]()
Was meinst du warum fast ein viertel nur Kommentare waren ![]()
die werden ja nicht mit-Kompiliert
![]()
```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
. 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.