ROB_87
February 7, 2025, 3:47am
1
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?
Rintin
February 7, 2025, 6:19am
4
ROB_87:
sizeof(freqSteps)
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.
ROB_87
February 7, 2025, 7:37am
5
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.
ROB_87
February 7, 2025, 8:02am
8
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.
Miq1
February 7, 2025, 9:03am
10
Ein rekursives Template könnte das leisten. Schau mal hier .
1 Like
Tommy56
February 7, 2025, 9:14am
11
Oder ohne Templates und ohne Rekursion mit Variadic functions , wie bei printf/sprintf.
Gruß Tommy
1 Like
system
Closed
August 6, 2025, 9:14am
12
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.