Deklaration
-
Hi egal welche Reihenfolge, compiler sagt fehler und ich weiss auch warum. Gibts ne Möglichkeit den zu umgehen?
int liste[n] = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 } ; const int n = sizeof(liste)/4;
-
int liste[] = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 } ;
Der Compiler findet die Größe selber raus.
-
Ja ich brauche die variable um sie als bedingung in eine for schleife zu tun
-
@ycbm
Ja, du kannst dann ja auch mitconst int n=...
weitermachen.
Schreib aber nicht /4, sondern teile durch die Größe eines Elements (hier also sizeof(int).
Oder allgemein:const size_t N = sizeof( liste ) / sizeof( *liste );
-
Ich habe noch andere Vorschläge:
a) Nimm std::size.
int liste[] = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 } ; const size_t n = std::size(liste);
Vorteil: du brauchst nicht selbst zu dividieren, std::size gibt dir gleich die Länge des Arrays zurück. Auch wenn du später aus dem Array einen vector machen solltest - std::size funktioniert dann weiterhin.
Nachteil: geht erst ab C++17. Andererseits haben wir schon 2020...b) Nimm ein std::array.
std::array<int, 10> liste = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 } ; const size_t n = liste.size(); // oder seit C++17 auch std::size(liste);
Nachteil: du musst die Zahl explizit angeben.
Vorteil: std::arrays verhalten sich bei Paramterübergabe so, wie man sich das denkt und konvertieren nicht automatisch in einen Pointer. Außerdem gibt es keinen Grund, eine Variable n überhaupt zu haben.c) nimm std::vector.
std::vector<int> liste = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 } ; const size_t n = liste.size(); // oder seit C++17 auch std::size(liste);
Vorteil: Standard-Lösung, die ohne Nachdenken einfach so funktioniert. Es gibt eigentlich auch hier keinen Grund, das n überhaupt als separate Variable zu haben.
Nachteil: Diese Lösung hat Overhead.
-
Noch besser:
@ycbm sagte in Deklaration:
Ja ich brauche die variable um sie als bedingung in eine for schleife zu tun
Brauchst du nicht.
for(int x: liste) { // x geht durch die Liste durch }
-
@wob sagte in Deklaration:
a) Nimm std::size.
...
Nachteil: geht erst ab C++17. Andererseits haben wir schon 2020...Vorher hat man das z.B. mit so einer Hilfsfunktion gemacht (ab C++11):
template <typename T, std::size_t N> constexpr auto array_size(const T (&)[N]) -> std::size_t { return N; }
Das zeigt auch, dass Arrays fester Größe eben nicht dasselbe wie simple Pointer sind, sondern ein eigener Typ mit eingebetteter Größe.
Dennoch empfehle ich ebenfalls
std::vector
,std::array
oder noch besser, den von SeppJ vorgeschlagenden Range-based for loop, wenn man nicht direkt dasn
benötigt.