Mache es zuerst getrennt mit zwei Schleifen, dann wird man sehen, was du überhaupt erreichen möchtest, dann kann man es eventuell mit nur einer Schleife realisieren.
Dann geht das mit einer Referenz auf das Array, aber nur wenn alle Arrays gleich lang sind. Besser wäre ein Zeiger auf das erste Element:
1
constbyte*Arrayvariable=Arr1;
Da musst du dann aber natürlich auch irgendwie dafür sorgen, dass deine Schleife nicht über das Array-Ende hinaus geht.
Warum verwendest du nicht gleich std::array oder std::vector?
Dir muss erst mal klar sein, was du da überhaupt schreibst. Nehmen wir erst mal die normale for Schleife:
1
for(inti=0;i<4;i++){
2
}
Die for schleife hat 3 teile. Der erste teil passiert als erstes. Der mittlere teil ist die Bedingung, die wird vor jedem Schleifendurchlauf überprüft. Der letzte teil wird nach jedem Schleifendurchlauf geprüft.
Das ist das selbe, wie die for schleife oben:
1
{
2
inti=0;
3
while(i<4){
4
// Inhalt
5
i++;// Ganz am Schluss
6
}
7
}
Wenn man da schrittweise durchgeht, passiert da dass:
1
int i = 0; // Variable i vom type int wird deklariert, und mit 0 initialisiert
2
i < 4 // i ist 0, 0 < 4 ergibt 1 (also true / wahr), denn 0 ist kleiner als 4.
3
// Hier würde der Schleifen Inhalt kommen
4
i++ // i wird um 1 erhöht. i ist nun 1.
5
i < 4 // i ist 1, 1 < 4 ergibt 1 (also true / wahr), denn 1 ist kleiner als 4.
6
// Hier würde der Schleifen Inhalt kommen
7
i++ // i wird um 1 erhöht. i ist nun 2.
8
i < 4 // i ist 2, 2 < 4 ergibt 1 (also true / wahr), denn 2 ist kleiner als 4.
9
// Hier würde der Schleifen Inhalt kommen
10
i++ // i wird um 1 erhöht. i ist nun 3.
11
i < 4 // i ist 3, 3 < 4 ergibt 1 (also true / wahr), denn 3 ist kleiner als 4.
12
// Hier würde der Schleifen Inhalt kommen
13
i++ // i wird um 1 erhöht. i ist nun 4.
14
i < 4 // i ist 4, 4 < 4 ergibt 0 (also false / falsch), denn 4 ist nicht kleiner als 4.
15
// Die Schleife ist zu ende
Wie dir eventuell auffällt, hat das noch nichts mit Arrays zu tun.
Wenn du sowas hier hast:
1
constbyteArr1[]={Val1,Val2};
2
intx=Arr1[0];
Dann heisst das Arr1[0] lediglich, bei Arr1, dereferenziere das 0te Element.
Oder sowas:
1
constbyteArr1[]={Val1,Val2};
2
inti=0;
3
intx=Arr1[i];
Da heisst das Arr1[i] lediglich, bei Arr1, dereferenziere das Element mit index i, in dem Beispiel ist i gerade 0.
Wenn du also z.B. sowas hier hast:
1
constbyteArr1[]={1,2,3,4};
2
constbyteArr2[]={5,6,7,8};
3
intArr3[4];
4
for(inti=0;i<4;i++){
5
Arr3[i]=Arr1[i]+Arr2[i];
6
}
Wir nutzen i hier als Index bei Arrays. Aber das ist keine spezielle Sache. Nichts, was man lernen müsste. An I, den Arrays, der Schleife, und den Array Lookups, ist da nichts spezielles, was nicht aus den einzelnen schritten hervorgehen würde.
Es ist nicht schlecht, das grosse ganze im im Auge zu behalten, was man tun will. Aber am ende muss man es halt doch ganz mechanistisch auf konkrete einzelne Schritte runter brechen. Man braucht beides. Im Grunde ist das alles ganz Stumpfsinniges planen.
Hier kannst du damit zuerst mal anfangen, indem du dir überlegst, was kommt da an Daten rein, was geht wieder raus, oder was soll es sonst so damit machen. Und dann setzt du es um.
Konkreter ist es so:
Ich habe zwei Variablen - a und b.
So lange variable b null ist, soll die for-Schleife laufen. In der for-Schleife sind vier Arrays, von den drei Konstant da sind, während die Schleife läuft. Der vierte Array wechselt, je nach dem, wie Variable a gefüllt ist, zwischen 9 weitern Arrays. Sprich: Es wird ein Wert - eine Zahl- an a übergeben, bspw. 3. dann soll das Array 3 den Platz des Variablen Array in der for-Schleife annehmen. Alles Arrays sind mit Elementen gefüllt, unterschiedlich viele und alle sollen über die Zählung der Schleife ausgegeben werden.
Konkreter ist es so:
Ich habe zwei Variablen - a und b.
So lange variable b null ist, soll die for-Schleife laufen. In der
for-Schleife sind vier Arrays, von den drei Konstant da sind, während
die Schleife läuft. Der vierte Array wechselt, je nach dem, wie Variable
a gefüllt ist, zwischen 9 weitern Arrays. Sprich: Es wird ein Wert -
eine Zahl- an a übergeben, bspw. 3. dann soll das Array 3 den Platz des
Variablen Array in der for-Schleife annehmen. Alles Arrays sind mit
Elementen gefüllt, unterschiedlich viele und alle sollen über die
Zählung der Schleife ausgegeben werden.
Das ist zwar immer noch nicht hinreichend konkret, aber was solls.
Nur eine Frage hierzu, wie wird das Ende eines Arrays erkannt?
Nie und gar nicht. Du musst immer selbst schauen, dass du nur auf Elemente zugreifst, die auch existieren. Da gibt es mehrere Möglichkeiten. Man kann sich merken, wie gross das Array ist / das irgendwo abspeichern. Oder man kann sich das Ende des Arrays merken.
Nie und gar nicht. Du musst immer selbst schauen, dass du nur auf
Elemente zugreifst, die auch existieren. Da gibt es mehrere
Möglichkeiten. Man kann sich merken, wie gross das Array ist / das
irgendwo abspeichern. Oder man kann sich das Ende des Arrays merken.
Geh einfach mal davon aus das mir dieser Sachverhalt durchaus klar ist, war an den TO gerichtet damit er die eigentliche Aufgabe sieht.
Und üblich sind zwei Vorgehensweisen: 1. Merken der Arraylänge oder 2. ein Terminierungszeichen.
Und üblich sind zwei Vorgehensweisen: 1. Merken der Arraylänge oder 2.
ein Terminierungszeichen.
Oh je: was soll denn bei dem Elementtyp "byte" der Wert des Sentinel sein? 0 oder 255? Und wer stellt sicher, dass dieser Wert nicht vorkommt. Nein, das ist Bruch. Wenn man so etwas machen will, dann muss man einen Typ nehmen, der in seinem Wertebereich einen ungültigen Wert (Null-Wert) hat. Bei byte ist das nicht der Fall bzw. möglich, bei dem abgeleiteten Typ T* schon (nullptr). Also, entweder macht man sich einen entsprechenden domänenspezifischen Datentyp oder man nimmt einen additiven Datentyp aus der stdlib wie etwa std::optional<>.
Und üblich sind zwei Vorgehensweisen: 1. Merken der Arraylänge oder 2.
ein Terminierungszeichen.
Oh je: was soll denn bei dem Elementtyp "byte" der Wert des Sentinel
sein?
Das kommt auf den Anwendungsfall an. Und wenn's keins gibt, lässt sich diese Methode nicht anwenden.
0 oder 255? Und wer stellt sicher, dass dieser Wert nicht
vorkommt.
Entweder gibt es in der Anwendung einen Wert, der in den normalen Daten ungenutzt ist, dann muss man das nicht sicherstellen, weil es sich automatisch ergibt, oder es gibt keinen, dann kann man es so nicht machen.
Wenn Du tatsächlich in C++ programmierst und nicht nur C-Code mit dem C++-Compiler übersetzt, dann solltest Du entweder std::array<> oder std::vector<> als allg. Container verwenden, und nicht raw-c-arrays einsetzen. Beim dynamischen std::vextor<> fällt dann auch eine Ende-Erkennung per Sentinel oder sonst wie weg.
Deine Quell-Container sind dann etwa von Typ std::vector<byte>, und wenn Du davon 9 Stück hast, kannst Du die in std::array<std::vector<byte>, 9> stecken.
Deine fixen Container dann ebenso in std::array<std::vector<byte>, 3>;
In der Loop benutzt Du dann einfach den a-ten Container.
1
std::array<std::vector<byte>,9>containers1;
2
std::array<std::vector<byte>,3>containers2;
3
4
// ...
5
6
uint8_ta=...;
7
8
for(size_ti=...){
9
// Prüfen, ob i im Indesbereich des Containers ist.
10
containers1[a][i]....// das i-te Element des a-ten Containers
Konkreter ist es so:
Ich habe zwei Variablen - a und b.
So lange variable b null ist, soll die for-Schleife laufen. In der
for-Schleife sind vier Arrays, von den drei Konstant da sind, während
die Schleife läuft. Der vierte Array wechselt, je nach dem, wie Variable
a gefüllt ist, zwischen 9 weitern Arrays.
Das ist relativ einfach. Was soll denn ausgegeben werden, wenn die Schleifenvariable für einen Array schon "hinter" dem letzten Element steht?