Hallo,
ich spiele gerade was mit for each Schleifen rum
Dabei hat dann was nicht geklappt , ich hab das jetzt mal auf ein ganz einfaches Beispiel runter gebrochen. So wie ich das im Moment sehe geht das so auch nicht. Problem ist eigentlich wie komme ich an den Index damit ich den z.B für b [index] nutzen kann.
Heinz
int a[]={10,20,30,40,50};
int b[]={100,200,300,400,500};
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
for(auto &elm :a){
Serial.print(elm); Serial.print(" ");
Serial.println(b[elm]); // das kann ja so nicht stimmen
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Ja damit ich damit auf was anderes zugreifen kann , im Beispiel halt auf b
ich hab dazu folgendes gefunden
https://www.learncpp.com/cpp-tutorial/for-each-loops/
Since C++20, range-based for-loops can be used with an init-statement just like the init-statement in normal for-loops. We can use the init-statement to create a manual index counter without polluting the function in which the for-loop is placed.
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
uint16_t elmNumb = 0;
for (auto &elm : a)
{
Serial.print(elmNumb); Serial.print(" ");
Serial.print(elm); Serial.print(" ");
Serial.println(b[elmNumb]); // das kann ja so nicht stimmen
elmNumb++;
}
}
- vielleicht nicht ganz ernst zu nehmen, aber das wäre meins, wenn ich was neues ausprobieren müsste...
Wobei viele "Bücher" da gerne die UrUrUrGrundlagen vergessen.
Und die finden sich schon in Babylon, auf Tontäfelchen gekratzt.
Die ollen Griechen haben sich damit beschäftigt.
Und wir kennen das Wort "iterieren" aus dem Lateinischen.
Im Grunde beschreibt es die abstrakte Idee, dass es "fortschreitende" Prozesse in diesem Universum gibt.
z.B. hat das Wort UrUrUrGrundlagen schon 4 Iterationsstufen hinter sich, bis zum Heute.
Das mit dem Iterieren ist also keines falls irgendwie neu oder überraschend.
Das einzige neue daran ist, zumindest in C++:
Damals, als es nur die alten schleifen gab, hatten "wir" oft einen Container/Array, sind mit einer Schleife darüber hinwegiteriert, und haben im Schleifenkörper einen Code/Algorithmus ausgeführt.
Diese 3 Elemente waren zusammengehörig.
Datenbasis Iteration Algorithmus
Die werden jetzt und hier voneinander getrennt.
Als einzelne, austauschbare Dinge betrachtet.
Idealer Weise führt uns das dazu, dass man einen Algorithmus auf jedem Container anwenden kann. Es muss einen nicht interessieren, ob das ein Baum, eine Liste, oder ein Array ist.
Es müssen noch nicht einmal reale Daten sein.
Hier mal, wie man über einen "Bereich" eines Arrays hinweg iterieren kann.
Dürfte so ziemlich die einfachste "Iterator Sache" sein.
Operatoren müssen wir dafür nicht bauen, da die verwendeten Pointer das schon haben.
#include <Streaming.h> // die Lib findest du selber ;-)
Print &cout = Serial; // cout Emulation für "Arme"
template<typename FeldType>
class Bereich // Teilbereich eines Arrays Bereich<Type>(von,bis)
{
private:
FeldType *start, *ende;
public:
Bereich(FeldType *feld, unsigned startIndex ,unsigned anzahl): start(feld+startIndex), ende(feld+startIndex+anzahl){}
FeldType *begin(){return start;}
FeldType *end() {return ende; }
};
int feld[] {1,77,4,7,3,9,2,0,4}; // ein ganz normales unsortiertes Array
void setup()
{
Serial.begin(9600);
cout << F("Start: ") << F(__FILE__) << endl;
// Bereich ausgeben ab 3te Element, 2 Elemente
for(auto d:Bereich<int>{feld,2,2}) cout << d << ' ';
cout << endl;
}
void loop()
{
}
Hallo
vielen Dank für das Beispiel, das hab ich im wesentlichen verstanden. Allerdings muss ich über den Sinn des Ganzen und die Möglichkeiten und Vorteile dazu noch mal in mich gehen. Wenn mich mal was packt geb ich so schnell nicht auf.
Heinz