Nutzung der C++ Arduino Ticker Klasse bringt ploetzlich Compilefehler

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Vor 2 jahren habe ich mal eine kleine Blinkklasse geschrieben die u.A. auch once_ms der Tickerklasse nutzt. Diese habe ich auf Github gestellt.

    Ich benutze diese Klasse auch selbst bei mir fuer ein ESPNow Gateway. Jetzt wollte ich den Gateway Code nach laengerer Zeit updaten und bekomme ploetzlich die Klasse nicht mehr compiliert :wallbash: Es ist ein ESP32.

    Konkret geht es um diese Zeile. Der Compiler wirft eine mir leider unverstaendliche Fehlermeldung aus :conf: . Da dort auch eine Lambda Funktion genutzt wird und zu meiner Zeit als ich mit C++ gearbeitet hatte noch keine Lamdas gab bin ich da ziemlich unbeleckt und aufgeschmissen. __deets__ hatte mir damals geholfen . Leider ist er nicht mehr im Forum :(

    Die Compilefehlemeldung sieht wie folgt aus:

    Hat jemand eine Idee was die Ursache sein kann und wie ich es fixen kann? Den Fehler bekomme ich auf zwei Systemen wo der Compile frueher ohne Probleme durchlief. Es scheint mir so dass irgendwann mal bei einem Update des Arduinos oder des C++ Compilers das Problem reingekommen ist. Ich schaetze der C++ Compiler wurde geaendert.

    Ich hatte die Zeile mal wie folgt geaendert:

    Und da ging der Compile durch. Leider macht der Code dann natuerlich nicht das was ich moechte. Aber es liegt ziemlich sicher irgendwie an der genutzen Lambda Funktion :gk1:

  • Nutzung der C++ Arduino Ticker Klasse bringt ploetzlich Compilefehler? Schau mal ob du hier fündig wirst!

  • Hallo framp,

    ich habe jetzt keine Lust, mich in den Code einzuarbeiten... Die anderen beiden C- bzw. C++-Programmierer, die Dir helfen könnten, sind Dreamshader und Schnasseldag. Und Zentris kann auch C / C++. Sonst fällt mir niemand ein, der hinreichend sicher ist.

    Auf den ersten Blick scheint es eine Änderung in den von Dir verwendeten Datentypen zu geben sowie wie diese implizit konvertiert wurde - und jetzt möglicherweise explizit konvertiert werden müssen.

    Aber wie gesagt, ohne tiefer gehende Code-Analyse ist das nur ein Schnellschuss von mir...

    Könnte es sein, dass Du einen Kompatibilitätsmodus, den es damals noch nicht gab, bei den aktuellen Compilern einstellen musst?

    Hast Du mal versucht, die Version des Compilers zu verwenden, die Du damals verwendet hast?

    (Ich kommentiere immer die verwendeten Versionsstände von Compiler / Linker im Code - um das Teil mit den ursprünglichen Werkzeugen zum Laufen zu bekommen, falls die Sprache ein paar Schlenker macht.)


    Ist da nicht ein Leerzeichen zu viel?

    Code
    this->ticker.once_ms(this->onTime, [this]() { this-> flipLED(); });

    Ich würde this->flipLED(); schreiben.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (12. November 2022 um 22:10)

  • ohne tiefer gehende Code-Analyse

    Nee, das verlange ich ja auch nicht. Ich habe noch mal ein wenig im netz gesucht: Die Lambdas haben sich quasi staendig von einer C++ Version zur naechsten geaendert :conf: Aktuell nutze ich gcc version 7.5.0. Was ich frueher genutzt habe als es noch funktioniert weiss ich leider nicht. Dann koennte ich sicherlich gezielter nach Deltas bei Lambdas suchen.

    Könnte es sein, dass Du einen Kompatibilitätsmodus, den es damals noch nicht gab, bei den aktuellen Compilern einstellen musst?

    Kann schon sein. Meine Hoffnung ist jemand weiss genau was sich da bei den Lamdas mal wieder geaendert hat.

    Was passiert mit dieser Version?

    Selbiger Compilefehler :(

    Oder so?

    Sieht vielversprechend aus :thumbup: . ich musste noch die flipLed von private auf public aendern und die zweite Stelle wo auch noch once_ms im Code genutzt wird anpassen und der Compile laeuft dann durch :bravo2: .

    Testen werde ich das aber heute nicht mehr. Morgen ist auch noch ein Tag :) . Du hast die Lambda Funktioni durch eine normale Callbackfunktion ersetzt. Gute Idee und beweist dass es irgendwie eine Aenderung bei den Lambdas gegeben hat.

    Bin mal gespannt auf morgen :)

  • Bin mal gespannt auf morgen

    Oder so funktioniert :bravo2: Thx Tell

    Es blink was. Allerdings leider nicht so wie es soll :no_sad: Ich bin mir sicher dass es vorher funktioniert hat. Jetzt muss ich mal debuggen was die Ursache ist. An der Codeaenderung sollte es eigentlich nicht liegen.

    Ich hab noch ein bisschen gegoogelt.

    Habe ich auch. Aber erfolglos. Wonach suchst Du da? Bei cpp Fehlermeldungen habe ich echt ein problem die richtigen Suchargumente zu finden :mad_GREEN:

  • (Ich kommentiere immer die verwendeten Versionsstände von Compiler / Linker im Code - um das Teil mit den ursprünglichen Werkzeugen zum Laufen zu bekommen, falls die Sprache ein paar Schlenker macht.)

    guter Hinweis, das hätte ich mal von Anfang an in der Arduino IDE und dem gcc machen sollen, diese ständige Compiler und Lib Änderei nervt!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Es blink was. Allerdings leider nicht so wie es soll

    Ist alles schon OK. Ich habe nach 2 Jahren bei dem Code im Detail vergessen was das Beispielprogramm genau blinkt bzw morst und musste mich erst wieder in den Code einlesen :blush: .

    Anyhow habe ich das Blinken jetzt enhanced: Man erkennt die Unterschiede der Morsezeichen jetzt besser :)

    Und jetzt wird keine Lambda Funktion mehr genutzt die vermutlich im naechsten C++ Standard wieder geaendert werden wird :shy:

    Noch mal Danke an Tell fuer seine Tipps.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!