Array of methods

Wer ist "Euch"?

Vermutlich machst du was falsch.

Ich habe mal das Beispiel aus #15 "grob" in Deinen Code übersetzt. Vielleicht verstehst Du das Beispiel dann besser:

#include <FastLED.h>

constexpr uint8_t DATA_PIN {16};
constexpr unsigned int NUM_LEDS {16};
CRGB leds[NUM_LEDS];

class Scenario {    // Interface
public:
  virtual int tuwas() { return 0; }
};

class ScRandom : public Scenario {
private:
  unsigned long delay_milli;
  unsigned long last_millis {0};

public:
  ScRandom(unsigned long dm) : delay_milli {dm} {}

  virtual int tuwas() override {
    unsigned long m = millis();
    if ((m - last_millis) < delay_milli) { return 0; }
    Serial.println("In ScRandom");
    last_millis = m;
    for (size_t i = 0; i < NUM_LEDS; leds[i++] = CRGB(random8(), random8(), random8())) {
      ;
    }
    FastLED.show();
    return 1;
  }
};

class ScPrint : public Scenario {
private:
  Print& output;

public:
  ScPrint(Print& stream) : output {stream} {}
  virtual int tuwas() override {
    output.print("In ScPrint: Ich tu was...");
    output.println("aber nicht leuchten");
    return 0;
  }
};

Scenario* scenarios[] {new ScRandom {200}, new ScPrint {Serial}};

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(255);
  FastLED.clear();
}

void loop() {
  if (scenarios[0]->tuwas()) {
    scenarios[1]->tuwas();
  }
}

Da ist nicht alles so ganz sinnvoll, aber das Beispiel soll ja nur das Prinzip zeigen.

Zum Ausprobieren:

Im übrigen:

Weder den hilfswilligen Forenmitgliedern noch Dir hilft so eine Aussage, wenn Du deinen Versuch nicht präsentierst.

Wo nichts zu sehen ist, kann Dir auch keiner sagen was Du falsch gemacht hast.

Danke, das war etwas hilfreicher.
Ich konnte das Problem aber erst lösen, nachdem ich mir Artikel zu Basisklasse und abgeleiteter Klasse angeschaut hatte.
So ging's jetzt (auszugsweise):

class Scenario {
protected:
  int last_millis, delay_milli;
  virtual void efx() = 0;

public:
  virtual void init() = 0;  // Reine virtuelle Methoden (müssen überschrieben werden)
  int tuwas() {
    int m = millis();
    if ((m - last_millis) < delay_milli) {
      return 0;
    }
    last_millis = m;
    efx();
    return 1;
  }
};


class scenario_xy : public Scenario {

  void efx() override {  // hier der Code hin
    for (int i = 0; i < NUM_LEDS; leds[i++] = CRGB(random8(), random8(), random8()))
      ;
  };
public:
  void init() override {
    delay_milli = 200;
  }
};

und

Scenario* scenarios[] = { &sc_0, &sc_1, &sc_2, &sc_3 };
int call_func(int funcnum) {
  if (funcnum >= 0 && funcnum < sizeof(scenarios) / sizeof(scenarios[0])) {
    return scenarios[funcnum]->tuwas();  // Eleganter Funktionsaufruf!
  } else {
    Serial.println("Ungültige Szenario-Nummer");
    return -1;
  }
}

Merke: Poste immer vollständigen Code dann gibt es keine Raterei und du erhältst Antworten die von Anfang an (besser) passen.

Alle Helfer haben dir vollständige Codes gezeigt, und du zeigst wieder nur Code Schnipsel.
Merke: Poste immer vollständigen Code.

Alle Menschen sind gleich!
Nur manche, sind etwas gleicher, für die gelten auch keine Forenregeln.

Manche schreiben Kinderbücher und halten sich für Wirtschaftsexperten ... :rofl:

1 Like

...während echte Wirtschaftsexperten wissen, dass billiges Flugbenzin viel wichtiger ist. :rofl:

... und viel wichtiger als eine funktionierende Bahn :scream:

Wird hier gelästert ?

Denkt an die Bademäntel :slight_smile:

1 Like

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