Unbekannte Anz an Werten bei Obj-Instanzierung gleich mitgeben

Hi,

ich möchte das beim erzeugen eines Klassenobjekts ein Array unbekannter größe (max. 10) gleich mit geben.

Zusätzlich habe ich bei diesem Projekt versucht den Constructor noch zu überladen.

Hier mal die Definition:


#include <Arduino.h>

class multiSwitch{
  private:
    
    uint8_t uiLastStep=0; //Array grenze
    uint8_t uiAktStep=0; //aktuelle schaltposition
    int iPin;
    int iCh;
    uint8_t arrSteps[]; //Array für die Schaltstufen
  
  public:
    multiSwitch(){
      this->arrSteps = (0,255); //Ein | Ausschalter
    };
    multiSwitch(uint8_t onFreq){
      this->arrSteps = (0,onFreq);//Ein | Ausschalter mit definierter Ein Frequenz
    };
    multiSwitch(uint8_t *freqSteps){
      uint8_t _size= sizeof(freqSteps) / sizeof(uint8_t);
      this->arrSteps[0]=0; //Aus zustand
      for(int i=1;i<=_size;i++){
        this->arrSteps[i]=freqSteps[i-1];
      }
    }

    void init(int pin,int channel){
      this->iPin = pin;
      this->iCh = channel;
      ledcSetup(channel,5000,8);
      ledcAttachPin(pin, channel);

      this->uiLastStep = sizeof(arrSteps) / sizeof(uint8_t);
      this->uiAktStep = 0;
    };
    void set(uint8_t numberStep){
      ledcWrite(this->iCh,this->arrSteps[numberStep]);
    };

    void on(){
      this->uiAktStep++;
      this->uiAktStep = min(this->uiAktStep,this->uiLastStep);
      this->set;
    };

    void off(){
      this->uiAktStep =0;
      this->set;
    };

    void upper(){
      this->on();
    };
    void lower(){
      this->uiAktStep--;
      this->uiAktStep = max(this->uiAktStep,0);
      this->set;
    };
};

und dazu noch die INO:

#include <Switch.h>
multiSwitch diffSperre();

multiSwitch lichtHinten(200); //normales Licht kein Bremslich

multiSwitch lichtVorne((160,210,255));

Fehler:

In constructor 'multiSwitch::multiSwitch()':
C:\Users\User1796\Documents\Arduino\NewRcEsp32\Switch.h:14:13: error: invalid use of array with unspecified bounds

-> Wie könnte man sowas realisieren?

man könnte ein Template machen und damit die größe des Arrays festlegen.

probiert mit einem ESP32

Disclaimer: es geht nur um das template,
der Rest der Klasse scheint mir arg verworren zu sein und eignet sich nicht für die Wiederverwendung.

/*
   array größe mittels temmplate übergeben
   https://forum.arduino.cc/t/unbekannte-anz-an-werten-bei-obj-instanzierung-gleich-mitgeben/1351274
 */
#include <Arduino.h>

template <int arrSize>
class MultiSwitch {
    static_assert(arrSize <= 10, "max 10 fields");
  private:
    uint8_t uiLastStep = 0; //Array grenze
    uint8_t uiAktStep = 0; //aktuelle schaltposition
    int iPin;
    int iCh;
    uint8_t arrSteps[arrSize]; //Array für die Schaltstufen

  public:
    MultiSwitch(int b = 255)  {
      arrSteps[0] = 0;
      arrSteps[1] = b;
      // arrSteps = (0, a); //Ein | Ausschalter
    };

    /*
        MultiSwitch(uint8_t onFreq) {
          this->arrSteps = (0, onFreq); //Ein | Ausschalter mit definierter Ein Frequenz
        };
    */

    MultiSwitch(uint8_t *freqSteps) {
      this->arrSteps[0] = 0; //Aus zustand
      for (int i = 1; i <= arrSize-1; i++) {
        this->arrSteps[i] = freqSteps[i - 1];
      }
    }

    void init(int pin, int channel) {
      this->iPin = pin;
      this->iCh = channel;
      ledcSetup(channel, 5000, 8);
      ledcAttachPin(pin, channel);

      this->uiLastStep = sizeof(arrSteps) / sizeof(uint8_t);
      this->uiAktStep = 0;
    };
    void set(uint8_t numberStep) {
      ledcWrite(this->iCh, this->arrSteps[numberStep]);
    };

    void on() {
      this->uiAktStep++;
      this->uiAktStep = min(this->uiAktStep, this->uiLastStep);
      //this->set;
    };

    void off() {
      this->uiAktStep = 0;
      //this->set; //tbd
    };

    void upper() {
      this->on();
    };
    void lower() {
      this->uiAktStep--;
      //this->uiAktStep = max(uiAktStep, 0);  //tbd
      //this->set; //tbd
    };
};

MultiSwitch<2> diffSperre;

MultiSwitch<2> lichtHinten(200); //normales Licht kein Bremslich

uint8_t inital[] {160, 210, 255};
MultiSwitch<4> lichtVorne(inital);


void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

This text will be hidden

Hallo,

bis zu welchem Zeitpunkt ist die Arraygröße unbekannt und ab wann ist sie bekannt und konstant?

Dein Datentyp ist Pointer, nicht "Array mit der Länge 3"...

Du musst die Länge separat übergeben und abspeichern. Um arrSteps zu initialisieren holst du dir mit malloc() entsprechend Speicher.

Hi genau das:

uint8_t inital[] {160, 210, 255};
MultiSwitch<4> lichtVorne(inital);

Hatte ich gehofft zu umgehen. Ein Globales Array kann man ja auch Per Referenz übergeben und dann ganz normal im Objekt mit Arbeit.

bis zu welchem Zeitpunkt ist die Arraygröße unbekannt und ab wann ist sie bekannt

Die Anzahl der Werte wird mit der Definition des Object bekannt.

der Rest der Klasse scheint mir arg verworren zu sein

Hier soll eigentlich nur mit 2-3 Taster an/aus bzw. Heller/Dunkler/Aus realisiert werden.

dann lass den ganzen Spunsus weg, leg dein Array mit fixer Größe an.
Bei "bis zu 10 Werten" am ESP ist das eh egal.

Ich schliesse mich @noiasca an.
Alternativ: lege ein Array mit 10 Einträgen an und belege die mit -1.
Elemente, die mit Werten gefüllt wurden, kannst Du dann durchzählen.

Hi,

Ja allerdings das ist die "simpelste" Methode, mich fasziniert aber die Fragestellung und ich wollt halt mal wissen wie man sowas auch Lösen könnte.

du kannst auch einfach 9 Konstruktoren mit unterschiedlicher Anzahl an Parametern machen.

Ein rekursives Template könnte das leisten. Schau mal hier.

1 Like

Oder ohne Templates und ohne Rekursion mit Variadic functions, wie bei printf/sprintf.

Gruß Tommy

1 Like

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