Übertragung von Code in eine Klasse: Problem bei Arraydefinition (Anfängerfrage)



  • Moin,

    programmiere mit Arduino IDE und möchte funktionierenden Code in einer Klasse generisch einsetzbar machen.
    Das habe ich auch schon mit einigen Dingen hinbekommen, aber jetzt hänge ich seit ein paar Stunden fest.
    Offenbar verstehe ich da noch etwas Grundsätzliches nicht.
    Am liebsten wäre es mir, wenn ich gcintAnzPars gar nicht als Konstante festlegen müsste, sondern beim Erstellen der Klasse über einen Parameter definieren könnte. Aber das ist Schritt 2, erstmal soll es funktionieren.
    Wie kann ich einen Array in einer Klasse benutzen?

    Aus .h

    #ifndef MyBasics_h
    #define MyBasics_h
    
    class MyBasics
    {
    	public:
    		
    		const int gcintAnzPars = 10;
    		String gstrParseArr[gcintAnzPars];
    		int gintParsAkt;
    		
    	private:
    		
    };
    
    #endif
    

    Aus .cpp

    const int gcintAnzPars = 10; // <--- hier definieren, wie viele Teile maximal aus einem String geschnitten werden können
    String gstrParseArr[gcintAnzPars];
    int gintParsAkt; // Aktuelle Belegung des Parserarrys
    

    Fehlermeldung:

    xxx.h:14:23: error: invalid use of non-static data member 'MyBasics::gcintAnzPars'
    14 | String gstrParseArr[gcintAnzPars];
    | ^~~~~~~~~~~~
    xxx.h:13:13: note: declared here
    13 | const int gcintAnzPars = 10;



  • Du kannst ein Array nur mit fester Größe benutzen. D.h. entweder baust Du Deine Klasse in eine Template Klasse um, die dann eine Konstante als NonType Argument erwartet, oder Du wechselst auf einen Zeiger in der Klasse und allokierst Speicher dynamisch. Wobei dann hier ein SmartPointer angesagt wäre.

    // header
    template <int gcintAnzPars>
    class MyBasics {
    public:
        String gStrParseArr[gcintAnzPars];
        int gintParsAkt;
    };
    
    // implementation
    MyBasics<10> variable;
    


  • Zeig mal die ganzen Files und nicht Ausschnitte.



  • @john-0 sagte in Übertragung von Code in eine Klasse: Problem bei Arraydefinition (Anfängerfrage):

    Template Klasse

    Danke, John. Leider habe ich so gut wie nichts davon verstanden. Wenn ich statt der Konstanten die 10 hardcodiere, kompiliert es auch nicht. Meintest Du das mit "fester Größe"?

    x.cpp:12:1: error: 'String' does not name a type
       12 | String gstrParseArr[10];
    

    Mir ist bewusst, dass String im Mikrocontrollerumfeld aufgrund der Restriktionen manchmal zickig ist. Aber ich bekomme denselben Fehler, wenn ich meine Deklaration und den Code (unsinnigerweise) zu einem Nicht-Array ändere.

    String gstrParseArr1; // statt vorher String gstrParseArr[10]
    

    Das sieht so aus, als wäre da gar nicht das Array an sich das Problem, sondern mal wieder String, die alte Super-Diva... ☹



  • Ok, habe es jetzt gelöst, danke an alle, die mitgedacht haben. Anhand einer anderen Klasse, in der ich schon mal sowas hinbekommen habe, konnte ich das Problem einkreisen.

    Mehrere Fehler waren der Grund:

    • Deklaration der Variablen vor den include-Statements (-> hochgezogen)
    • Klassen-Editor (Dev C++) findet Zeichenkette im Code nicht zuverlässig (WTF? Was mache ich falsch?)
    • Klassenfunktion hatte noch einen Default-Wert bei einem Parameter (-> rausgenommen)


  • @N00bzilla sagte in [Übertragung von Code in eine Klasse: Problem bei Arraydefinition (Anfängerfrage)

    Das sieht so aus, als wäre da gar nicht das Array an sich das Problem, sondern mal wieder String, die alte Super-Diva... ☹

    Korrekt, nicht das Array verursacht das Problem.



  • @N00bzilla sagte in [Übertragung von Code in eine Klasse: Problem bei Arraydefinition (Anfängerfrage)

    Danke, John. Leider habe ich so gut wie nichts davon verstanden. Wenn ich statt der Konstanten die 10 hardcodiere, kompiliert es auch nicht. Meintest Du das mit "fester Größe"?
    Arrays müssen in C++ eine Größe haben, die zum Übersetzungszeitpunkt ermittelt werden kann. D.h.

    char string[10];
    

    ist möglich. Wenn man stattdessen

    char string[aVariable];
    

    schreibt, muss der Ausdruck aVariable zum Übersetzungszeitpunkt berechenbar sein. Willst Du die Größe eines Strings erst zur Laufzeit festlegen, wäre der ein std::string die sinnvollste Wahl. Allerdings gibt es von Dir zu wenig Kontext, um das im Rahmen des Themas „embedded“ konkret beantworten zu können.


Anmelden zum Antworten