const int countElements = sizeof(action) / sizeof(ServoLoop);
55
Serial.println("Count of elements: " + countElements);
56
for (int i = 0; i < countElements; i++) {
57
Serial.println("Action Element: " + i);
58
Serial.println(action[i].address);
59
delay(300);
60
}
61
62
Serial.println("ACTION_FINISHED");
63
}
Hier ist die Ausgabe lediglich
1
ACTION_BEGINN
2
Count of elements:
3
ACTION_FINISHED
4
ACTION_BEGINN
5
Count of elements:
6
ACTION_FINISHED
7
ACTION_BEGINN
8
Count of elements:
9
ACTION_FINISHED
Würde ich den Code im Loop wie folgt ausführen, käme das gewünschte
Verhalten zum Vorschein.
1
void loop() {
2
Serial.println("L_BEGINN");
3
const int countElements = sizeof(actionOne)/sizeof(ServoLoop);
4
for (int i = 0; i < countElements; i++) {
5
Serial.println(actionOne[i].address);
6
delay(300);
7
}
8
Serial.println("L STOP");
9
}
Mit der Ausgabe
1
L_BEGINN
2
1
3
2
4
1
5
2
6
L STOP
7
L_BEGINN
8
1
9
2
10
1
11
2
12
L STOP
13
....
Mein Ziel:
Ich möchte mehrere "Actions" frei definieren, und diese Aktion als
Parameter einer Methode übergeben und dort "Lokal" verarbeiten.
Ich bin mir dessen bewusst, dass ich bei der Übergabe der Variable
irgendwie was falsch mache, weil ich irgendwas Grundlegendes
offensichtlich nicht verstanden habe.
Mein zweiter Versuch geht in die Richtung:
1
executeAction(&actionOne);
2
3
// und als funktion
4
5
void executeAction(ServoLoop *action[]) {}
Doch dann erhalte ich vom Kompiler:
1
cannot convert 'ServoLoop (*)[4]' to 'ServoLoop**' for argument '1' to 'void executeAction(ServoLoop**)'
Was konkret habe ich noch nicht verstanden und wie müsste es korrekt
sein?
Eine zweite Aktion könnte sein
Um später es mal abwechselnd mit actionOne und actionTwo zu verarbeiten.
Ich würde gerne den Code kurz und nach dem DRY Prinzip aufbauen.
Vielen Dank für Hilfe
Grüße structeur
structeur schrieb:> Ich bin mir dessen bewusst, dass ich bei der Übergabe der Variable> irgendwie was falsch mache, weil ich irgendwas Grundlegendes> offensichtlich nicht verstanden habe.
Du kannst die Anzahl der Elemente in einem Array so nicht bestimmen.
Wenn du die Anzahl der Elemente in einem Array, das du als Parameter in
eine Funktion gibst, wissen musst, musst du dies als zusätzlichen
Parameter übergeben. Beispiel:
1
void f(TYPE* x, size_t count);
Den Trick den du anwenden möchtest der funktioniert nur in einem
statischen Kontext, also wenn du es auf ein globales oder statisches
Objekt anwendest. Folgendes geht:
1
static TYPE[] = { {}, {}, ... };
2
...
3
count = sizeof(TYPE)/sizeof(TYPE[0]);
Für die Parameter einer Funktion geht dies nicht. Der Grund ist einfach:
Im obigen Fall gibt es ein einziges Objekt, dessen Größe der Compiler
zur Compile-Zeit bereits kennt. Eine Funktion kann als Argument von
extern aber jedes beliebige Objekt zugeführt bekommen. Ein anderer
Denkansatz ist, dass die Auswertung von sizeof() immer zur Compile-Zeit
statt findet. Also so als hättest du statt sizeof() einfach eine
Konstante geschrieben. Der Compiler ist lediglich so nett, dir diese
Konstante zur Compile-Zeit zu berechnen.
Hallo g457,
erst ein mal Danke für die Antwort. Die half mir auf die Sprünge auch
wenn ich sie anfangs nicht mit einer funktionierenden Lösung in Einklang
bringen konnte.
Bei deiner Ausführung sind zwei Argumente von Nöten und das ist für
erstmal eine Lösung.
Für die Nachwelt: Das Problem ist, dass die Ermittlung von countElements
innerhalb der Methode executeAction falsch ist, die Übergabe aber von
actionOne korrekt ist sowie die Definition der Methode.
Meine bisherige Lösung sieht so aus, dass die Methode einen zweiten
Parameter erhält.
Falls jemand wüsste, wie es auch ohne den zweiten Parameter klappen
könnte, wäre ich für ein Beispiel der richtigen Schreibweise dankbar.
Hier nun meine funktionierender Code:
x^2 schrieb:> structeur schrieb:>> Ich bin mir dessen bewusst, dass ich bei der Übergabe der Variable>> irgendwie was falsch mache, weil ich irgendwas Grundlegendes>> offensichtlich nicht verstanden habe.>> Du kannst die Anzahl der Elemente in einem Array so nicht bestimmen.> Wenn du die Anzahl der Elemente in einem Array, das du als Parameter in> eine Funktion gibst, wissen musst, musst du dies als zusätzlichen> Parameter übergeben. Beispiel:> void f(TYPE* x, size_t count);>> Den Trick den du anwenden möchtest der funktioniert nur in einem> statischen Kontext, also wenn du es auf ein globales oder statisches> Objekt anwendest. Folgendes geht:> static TYPE[] = { {}, {}, ... };> ...> count = sizeof(TYPE)/sizeof(TYPE[0]);>> Für die Parameter einer Funktion geht dies nicht. Der Grund ist einfach:> Im obigen Fall gibt es ein einziges Objekt, dessen Größe der Compiler> zur Compile-Zeit bereits kennt. Eine Funktion kann als Argument von> extern aber jedes beliebige Objekt zugeführt bekommen. Ein anderer> Denkansatz ist, dass die Auswertung von sizeof() immer zur Compile-Zeit> statt findet. Also so als hättest du statt sizeof() einfach eine> Konstante geschrieben. Der Compiler ist lediglich so nett, dir diese> Konstante zur Compile-Zeit zu berechnen.
Danke für deine Ausführung. Die ist einleuchtend. Ist ja nicht PHP. :)
Verfahre ich dann damit "falsch"?
structeur schrieb:> Falls jemand wüsste, wie es auch ohne den zweiten Parameter klappen> könnte, wäre ich für ein Beispiel der richtigen Schreibweise dankbar.
1) struct { ServoLoop* pStart, int iLen }; als Übergabeparameter. Ist
aber dann das gleiche, wie zwei Parameter, nur nochmal gekapselt.
2) Einen speziellen Wert für ServoLoop an dem man erkennt, dass dies der
letzte ist. So wie bei C-String die '\0' als Ende. Du hast dann aber ein
sizeof(ServoLoop) im Speicher das du nicht brauchst. Außerdem ist das
bei Random Access auf das Array blöd, weil man erst suchen muss, wo das
Ende ist. Mit der Längenangabe kann man es einfach prüfen.