Anfängerfrage zu Umgang mit Variablen (hier: bool), die an eine Funktion übergeben werden



  • Moin,

    bin ganz neu in C++ und versuche gerade, meine bestehende Programmiererfahrung zu übertragen.
    Programmiere mit Arduino IDE für einen Microcontroller.
    Folgende Funktion FMonitorGetFazit funktioniert, so lange ich nur intWertID übergebe und den Teil mit bolNurEinZeichenZurückgeben komplett auskommentiere. Jetzt bekomme ich die Fehlermeldung

    Compilation error: 'FMonitorGetFazit' was not declared in this scope

    Mit der kann ich gar nichts anfangen. Habe schon versucht, statt "false" "False", "FALSE" usw. einzugeben, auch "1=2" funktioniert alles nicht.

    Wie kann ich eine boolsche Variable als einen von mehreren Parametern an eine Funktion übergeben?

    void MMonitorTextAnzeige(int intWertID, int intStartZID) {
      // übriger Code entfernt
      String strFazit;  
      strFazit = FMonitorGetFazit(intWertID, false);  // <--- dieser Befehl wird mit oben genannter Fehlermeldung bemängelt
    
    }
    
    String FMonitorGetFazit(int intWertID, bool bolNurEinZeichenZurückgeben){
        // Gibt anhand des Ist-Wertes in Relation zu den Soll- und Warnschwellen etc. ein Fazit zurück, z.B. "ok", "niedrig" usw. bzw. "F" oder "W", wenn die Kurzversion verlangt wird.
      String strFazit;
      String strKürzel;
      double dblIst;
    
      dblIst = gdbl_MonitorWertIst[intWertID][0];
    
      if (dblIst<=gdbl_MonitorWertFehlergrenzeUnten[intWertID]) { 
          strFazit = "!low!";
          strKürzel = "F";
        } else if (dblIst<=gdbl_MonitorWertWarngrenzeUnten[intWertID]) {    
          strFazit = "low";
          strKürzel = "W";
        } else if (dblIst<gdbl_MonitorWertWarngrenzeOben[intWertID]) {    
          strFazit = "ok"; 
          strKürzel = " ";
        } else if (dblIst<gdbl_MonitorWertFehlergrenzeOben[intWertID]) {    
          strFazit = "high";
          strKürzel = "W";
        } else if (dblIst>=gdbl_MonitorWertFehlergrenzeOben[intWertID]) {    
          strFazit = "!high!";
          strKürzel = "F";
        } else {
          strFazit = "Fehler!"; // Schwellwerte nicht richtig eingestellt? Datenfehler?
          strKürzel = "X";
      }   
      
      if (bolNurEinZeichenZurückgeben) {
        return strKürzel;
      } else {
         return strFazit;
      }
      
    }
    


  • Steht deine Funktion FMonitorGetFazit hinter der MMonitorTextAnzeige? Dann ist sie ja noch gar nicht bekannt. Oder steht sie auch in einem Header, den du includet hast? Ist dann im Header die Signatur auch korrekt?

    Unwahr ist false in C++ (alles klein), aber 1 == 2 funktioniert natürlich auch.



  • Vielen Dank, wob, damit hast Du mir sehr geholfen. 👍
    Dieses Grundprinzip war mir bislang nicht bekannt.
    Es erklärt aus meiner Sicht zwar nicht, warum die Funktion mit nur einem Parameter vorher trotzdem funktioniert hat, aber mir scheint, dass die Arduino IDE zuweilen komische Sachen macht, da muss ich mich drauf einstellen.



  • @N00bzilla sagte in Anfängerfrage zu Umgang mit Variablen (hier: bool), die an eine Funktion übergeben werden:

    Es erklärt aus meiner Sicht zwar nicht, warum die Funktion mit nur einem Parameter vorher trotzdem funktioniert hat

    Deswegen meine Frage nach dem Header. Vielleicht hast du in einem Header irgendwie die Version ohne den bool-Parameter drin? Oder deine IDE hat die irgendwann automatisch generiert und dann hast du den bool-Parameter nachträglich hinzugefügt, aber nicht im Header? Es könnte auch sein, dass du in derselben Datei eine Forwärts-Deklaration drin hast.

    Normalerweise sagt die Fehlermeldung aber auch noch mehr als du hierher kopiert hast. Es gibt da meist noch irgendwas wie "Candidate: <funktion mit nicht passender Signatur>" oder sowas ähnliches.



  • Bis eben wusste ich noch nicht einmal, dass ich einen Header habe... 😱

    So fängt mein Code an. Ist der Teil mit den Includes der Header? Bislang steht mein selbstgeschriebener Code komplett auf einer Seite, was mich ohnehin zwingt, mich mit der Strukturierung auseinanderzusetzen. In VBA erstelle ich einfach ein neues Modul, und kann dort über die Deklaration sehr gut steuern, was public für die anderen Module sichtbar ist. Eine Entsprechung habe ich hier noch nicht gefunden.

    #include <Adafruit_SSD1306.h> // aus YouTube Das SSD1306 OLED Display einfach erklärt. | #EdisTechlab
    #include <Adafruit_GFX.h>
    
    #define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)
    #define SCREEN_WIDTH 128 // OLED display Breite, in pixels
    #define SCREEN_HEIGHT 64 // OLED display Höhe, in pixels
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
    //*******************************************************************************************************************************************
    // K O N S T A N T E N   U N D   G L O B A L E   V A R I A B L E N
    //*******************************************************************************************************************************************
    


  • @N00bzilla sagte in Anfängerfrage zu Umgang mit Variablen (hier: bool), die an eine Funktion übergeben werden:

    Bis eben wusste ich noch nicht einmal, dass ich einen Header habe...

    Naja, ich weiß es doch auch nicht!

    Die Dateien mit Endung .h/.hpp/.hxx, die du mit #include ... einbindest, heißen Header. Du verwendest also Adafruit_SSD1306.h und Adafruit_GFX.h. Wenn du die nicht selbst geschrieben hast und da kein FMonitorGetFazit drin ist und du nur die eine Funktion FMonitorGetFazit hast, dann kann ich mir auch nicht erklären, warum dein Code funktioniert hat. Irgendwas anderes wird da das Problem gewesen sein - von nicht gespeichert bis was weiß ich ist vieles möglich.



  • Die Adafruit-Bibliotheken sind extern eingebunden, mit denen kann ich das Microdisplay ansteuern.
    FMonitorGetFazit ist von mir. Im Moment fällt es mir noch sehr schwer, zwischen Bedienfehler meinerseits, Fehlinterpretation und Bugs / Unzulänglichkeiten der Infrastruktur zu unterscheiden... Aber das wird schon!
    Danke Dir!



  • Dies scheint wohl ein spezielles Feature der Arduino-IDE + Build Tool/Compiler zu sein: Arduino: Declaration of Functions.
    Aber funktioniert wohl nicht immer korrekt...