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;
    


  • @ycbm

    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 mit const 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.


  • Mod

    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 das n benötigt.


Anmelden zum Antworten