anfängerproblem - mehrdimensionale Arrays



  • Vielen Dank für eure schnelle Hilfe!
    Der Weg nach Rom ist mir noch nicht 100%-ig klar, aber er zeichnet sich langsam ab.

    Vielen Dank!

    bis bald 🙄



  • groovemaster schrieb:

    Nicht angegebene Elemente werden nullinitialisiert.

    Wobei man hier vielleicht noch dazusagen sollte, dass nur Null-Initialisiert wird, wenn überhaupt ein Initialisierer da steht (für Arrays üblicherweise(aber nicht nur) {} ).

    Beispiel:

    int i1[3] = { 1, 2, 3 }; // Alle Elemente initialisiert
    int i2[3] = { 1, 2 }; // das dritte Element fehlt, aber es ist ein Initialisierungsausdruck da - i2[2] ist also 0
    int i3[3] = {}; // Alles wird mit 0 initialisiert, da ein Initialisierer da steht
    int i4[3]; // Alle Elemente enthalten jetzt einen undefinierten Inhalt (weil kein Initialisierer)
    

    Nullinitialisierung erfolgt übrigens nur für alle eingebauten Datentypen und sog. Plain Old Data(POD)-Typen (siehe FAQ dafür :)).



  • 7H3 N4C3R schrieb:

    Wobei man hier vielleicht noch dazusagen sollte, dass nur Null-Initialisiert wird, wenn überhaupt ein Initialisierer da steht (für Arrays üblicherweise(aber nicht nur) {} ).

    Wobei man hier vielleicht noch dazusagen sollte, dass dies nicht für Variablen mit static Lebensdauer gilt.

    7H3 N4C3R schrieb:

    Nullinitialisierung erfolgt übrigens nur für alle eingebauten Datentypen und sog. Plain Old Data(POD)-Typen (siehe FAQ dafür :)).

    Wieso und? Die eingebauten Datentypen gehören auch zu den PODs.

    :p



  • groovemaster schrieb:

    Wobei man hier vielleicht noch dazusagen sollte, dass dies nicht für Variablen mit static Lebensdauer gilt.

    Dann sollte man aber noch dazusagen, dass diese immer 0-initialsiert werden, sofern nicht anders angegeben und sofern sie auch keine dynamische Initialisierung benötigen. *g*

    groovemaster schrieb:

    Wieso und? Die eingebauten Datentypen gehören auch zu den PODs.

    :p

    Hmm ich dachte immmer, damit sind nur structs/unions/classes mit all ihren POD-Einschränkungen (is mir jetzt zu nervig die alle aufzuzählen, steht ja in den FAQ) gemeint - letztendlich also solche, die ein C-Speicherlayout bekommen.

    Hab aber keine Lust, die Bibel dafür zu bemühen 😃 🤡

    Eddit: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39495.html :p
    Hmm vielleicht sollten wir irgendwo einen Flamewar austragen 🤡



  • 7H3 N4C3R schrieb:

    Dann sollte man aber noch dazusagen, dass diese immer 0-initialsiert werden, sofern nicht anders angegeben und sofern sie auch keine dynamische Initialisierung benötigen. *g*

    dynamische Initialisierung? Ehrlich gesagt kenne ich keine dynamische Initialisierung bei Variablen mit static Lebensdauer. Was meinst du damit?



  • groovemaster schrieb:

    dynamische Initialisierung? Ehrlich gesagt kenne ich keine dynamische Initialisierung bei Variablen mit static Lebensdauer. Was meinst du damit?

    Z.B. Objekte mit nicht-trivialem Konstruktor. Die können ja schlecht vom Loader erstellt werden. Z.B. wird der Konstruktor eines Meyers-Singletons erst dann ausgeführt, wenn man die instance()-Methode das erste Mal bemüht. Das ist dann dynamische Initialisierung.
    Während ein static int vom Loader direkt auf 0 gesetzt wird (was dann statische Initialisierung ist).



  • 7H3 N4C3R schrieb:

    Eddit: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39495.html :p
    Hmm vielleicht sollten wir irgendwo einen Flamewar austragen 🤡

    Nunja, ich hab das noch etwas anders in Erinnerung. Und der Standard scheint dies zu bestätigen.

    Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to member types (3.9.2), and cv-qualified versions of these types (3.9.3) are collectively called scalar types. Scalar types, POD-struct types, POD-union types (clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively called POD types.

    7H3 N4C3R schrieb:

    Z.B. Objekte mit nicht-trivialem Konstruktor. Die können ja schlecht vom Loader erstellt werden. Z.B. wird der Konstruktor eines Meyers-Singletons erst dann ausgeführt, wenn man die instance()-Methode das erste Mal bemüht. Das ist dann dynamische Initialisierung.
    Während ein static int vom Loader direkt auf 0 gesetzt wird (was dann statische Initialisierung ist).

    Du driftest vom Thema ab. Es ging im Objekte mit statischer Lebensdauer und Nullinitialisierung. Und dort gibt es keine dynamische Initialisierung, das kommt uU erst später. Und nullinitialisiert wird immer.

    Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place. Zero-initialization and initialization with a constant expression are collectively called static initialization; all other initialization is dynamic initialization.



  • Genau die Stelle im Standard hatte ich auch gerade rausgesucht *g*. Amen. 🤡

    Und letzteres wollte ich ja genau hiermit aussagen:

    IchSelbst schrieb:

    Dann sollte man aber noch dazusagen, dass diese immer 0-initialsiert werden, sofern nicht anders angegeben und sofern sie auch keine dynamische Initialisierung benötigen.

    Wobei der letzte Part ja schon nur auf nicht-PODs zutrifft. Nur nicht dass jemand (der nicht so sehr mit den C++-Innereien vetraut ist) auf die Idee kommt, seine Klasse XY würde 0-initialisiert werden 🙂



  • 7H3 N4C3R schrieb:

    Wobei der letzte Part ja schon nur auf nicht-PODs zutrifft. Nur nicht dass jemand (der nicht so sehr mit den C++-Innereien vetraut ist) auf die Idee kommt, seine Klasse XY würde 0-initialisiert werden 🙂

    Wieso nicht?

    class foo
    {
    private:
        int a;
    public:
        foo()
        {
            std::cout << "Hello, world!";
        }
    };
    

    Dies ist kein POD, trotzdem wird nullinitialisert, sofern static Lebensdauer vorliegt.



  • ⚠ Ich muss ins Bett 😞

    Das Ding wird aber auch noch dynamisch initialisiert 🙂



  • 7H3 N4C3R schrieb:

    Das Ding wird aber auch noch dynamisch initialisiert 🙂

    Was zwar mit dem Thema nichts zu tun hat, aber selbst dies muss nicht unbedingt gemacht werden. Ein Compiler hat gewisse Freiheiten, wann er dynamische Initialisierung nun durchführt oder ob statische Initialisierung vollkommen ausreicht.


Anmelden zum Antworten