Array Instanz - ein Parameter für alle - Wie?

Hallo,

ich habe eine Klasse erstellt und möchte damit ein Array mit 64 Instanzen anlegen.
Der Parameter 'factor' der Klasse soll für alle Instanzen des Arrays gleich sein.

class MovingAverage                 
{
  private:   
    const unsigned factor;
    float average;   
    
  public:  
    MovingAverage(unsigned f) :
      factor {f},
      average {0}
    {}

  void averageFilter(const unsigned newValue)
  {
    average = ((average * factor) + newValue) / (factor + 1); 
  }
  
  float getAverage (void) { return average; }
};

MovingAverage mg [64] { ohne Ende der gleiche Parameter };

Jetzt müsste ich für die Array Instanz 64 gleiche Parameter angeben. Das macht irgendwie keinen Sinn. Ich könnte eine set Methode schreiben und mittels for Schleife den factor übergeben. Macht auch keinen richtigen Sinn, weil der soll konstant sein und bleiben. Gibt es eine Möglichkeit ein Array mit x Instanzen und einer Parameterangabe für alle anzulegen?

Mir gefällt nicht dass du "Parameter" dazu sagst, aber wenn ich richtig interpretiere was du möchtest, dann mach die member variable static - dann gilt das für alle Instanzen der Klasse MovingAverage.

edit: irgendwie scheint mir das aber ein eigenartiges Datenmodell zu sein...

Hallo,

hatte ich schon versucht. Das kompiliert leider nicht.
Was ist an Parameter falsch? Das ist der Filterfaktor.
Wenn es eine andere Idee gibt nur raus damit.
Ich möchte von 64 Werten jeweils den Mittelwert bilden.
Ich bekomme von einem ToF Sensor 64 Werte von seinen 64 Zonen.
Jeden Zonenwert möchte ich separat filtern.

class MovingAverage                 
{
  private:   
    static unsigned factor;
    float average;   
    
  public:  
    MovingAverage(unsigned f) :
      factor {f},
      average {0}
    {}

  void averageFilter(const unsigned newValue)
  {
    average = ((average * factor) + newValue) / (factor + 1); 
  }
  
  float getAverage (void) { return average; }
  
  unsigned getFactor (void) { return factor; }
};

MovingAverage mg [64] {50};

Error:

src/MittelwertGleitend.h: In constructor 'MovingAverage::MovingAverage(unsigned int)':
src/MittelwertGleitend.h:24:7: error: 'unsigned int MovingAverage::factor' is a static data member; it can only be initialized at its definition
   24 |       factor {f},
      |       ^~~~~~
sketch.ino: At global scope:
sketch.ino:133:51: error: could not convert '<brace-enclosed initializer list>()' from '<brace-enclosed initializer list>' to 'MovingAverage'
  133 | MittelwertGleitend mg (50);
      |                                                   ^
      |                                                   |
      |                                                   <brace-enclosed initializer list>

schau dir mal das an, ob dir das eine Richtung gibt:

Hallo,

hier liegt ein Missverständnis vor.
Ich bekomme vom ToF ständig einen Datensatz von 64 neuen Werte. Ein Wert je Zone.
Die Zonenwerte möchte ich separat filtern. Jede Zone für sich.
Deswegen benötige ich laut aktueller Überlegung soviel Instanzen für die Mittelwertbildung wie der Sensor Zonen hat. Das sind 64.
Ich möchte keinen Mittelwert über alle Zonenwerte.
Ich möchte jede Zone einzeln mitteln.

du brauchst die 50 nicht jeder Instanz übergeben sondern direkt der Klasse.
entweder machst den factor public oder

MovingAverage::factor = 50;

oder mach einen setter und ruf in für die Klasse auf.

mach mal einen kompletten Sketch dann kann man sich damit spielen.


template<unsigned factor>
class MovingAverage                 
{
  private:   
    float average;   
    
  public:  
    MovingAverage() :     
      average {0}
    {}

  void averageFilter(const unsigned newValue)
  {
    average = ((average * factor) + newValue) / (factor + 1); 
  }
  
  float getAverage (void) { return average; }
};

MovingAverage<42> mg [64] ;
2 Likes

compiliert und tut am Mega:


class MovingAverage {
  private:

    float average = 0;

  public:
    static unsigned factor;
    void averageFilter(const unsigned newValue) {
      average = ((average * factor) + newValue) / (factor + 1);
    }

    float getAverage (void) {
      return average;
    }

    unsigned getFactor (void) {
      return factor;
    }

    void debug() {
      Serial.println(factor);
    }
};
unsigned MovingAverage::factor {50};

MovingAverage mg [64];


void setup() {
  Serial.begin(115200);
  mg[0].debug();

}

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

}

Die Template Variante von combie macht den Code aber besser wiederverwendbar.

Hallo,

ich danke Euch. Das mit dem static wäre dann das nächste Problem gewesen. :wink: Die Klasse wäre für nichts anderes verwendbar gewesen. Das Template funktioniert. Danke. Im Forum darüber reden, schon kommt man zu einer Lösung. Prima.

Danke für die Blumen!