Alle variablen einer struct auf 0 setzen



  • ZeroM schrieb:

    das kann bei 200 und mehr elementen schon mühsam sein

    Arrays kennst du aber schon? Was sind das denn alles für Variablen?


  • Mod

    memset hilft nur bedingt und macht den Code unnötig komplex.

    int main()
    {
        T x1 = {0};     // (1)
        T x2 = {};      // (2)
        T x3 = T();     // (3)
        T* p = new T(); // (4)
    }
    

    (1) ist der Standardweg in C (sofern der Programmierer sich nicht schon "aus Geschwindigkeitsgründen" auf memset eingeschossen hat...).
    (2) ist nur in C++ möglich und dort allgemeiner als (1), weil es auch mit leeren Aggregaten zurecht kommt oder solchen, deren erstes Element nicht per konstantem 0 initialisiert werden kann (beides gibt es in C nicht).
    (3) funktioniert, falls T POD ist, oder einen entsprechend definierten Defaultkonstuktor besitzt.
    (4) dito; im Falle von Arrays, falls (4) für die Elemente gilt.



  • Das kannst du ganz einfach so schreiben:

    struct myStruct
    {
        int a, b, c;
        int aa, bb, cc;
        // ...
    } ms={};
    

    Kein Tippfehler, zwischen den {} muss tatsächlich nix stehen.



  • memsetter schrieb:

    Bei POD-Typen kannst du einfach memset verwenden.

    Das funktioniert auch so auf X64 oder X86. Auf anderen Platformen könnte das auch mal schiefgehen. Ich glaube, dass das nicht vom C++ Standard so garantiert wird. Zum Beispiel ist nicht gesagt, dass ein Nullzeiger durch eine Folge von Null-Bytes repräsentiert werden muss. Wenn Du eine Folge von Null-Bytes als Zeiger reinterpretierst, muss dass auch kein Nullzeiger sein. Bei Ganzzahlen aber erhältst Du durch das Löschen aller Bits der Repräsentierung auch wirklich die 0 als Wert.



  • Burkhi schrieb:

    Das kannst du ganz einfach so schreiben:

    struct myStruct
    {
        int a, b, c;
        int aa, bb, cc;
        // ...
    } ms={};
    

    Kein Tippfehler, zwischen den {} muss tatsächlich nix stehen.

    ich glaube ihr versteht mich falsch, ich möchte sie nicht von anfang an auf 0 haben, sondern beim aufruf von irgendwas...

    arrays kenne ich schon, doch jede variable hat nen anderen namen und dann kenn ich mich mit arrays nicht mehr aus...

    struct aaa
    {
    	int a, b;
    } aA = {};
    

    <-- das klappt

    struct aaa
    {
    	int a, b;
    } aA;
    
    void aaaa()
    {
    	aA = {};
    }
    

    <-- das jedoch nicht :S



  • Ja, wiegesagt, memset() wenn POD, ansonsten manuell.


  • Mod

    aA = aaa();
    


  • krümelkacker schrieb:

    [...]Auf anderen Platformen könnte das auch mal schiefgehen. Ich glaube, dass das nicht vom C++ Standard so garantiert wird. Zum Beispiel ist nicht gesagt, dass ein Nullzeiger durch eine Folge von Null-Bytes repräsentiert werden muss.[...]

    ISO/IEC 14882:2003 §4.10 schrieb:

    A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type[...]



  • Tachyon schrieb:

    krümelkacker schrieb:

    [...]Auf anderen Platformen könnte das auch mal schiefgehen. Ich glaube, dass das nicht vom C++ Standard so garantiert wird. Zum Beispiel ist nicht gesagt, dass ein Nullzeiger durch eine Folge von Null-Bytes repräsentiert werden muss.[...]

    ISO/IEC 14882:2003 §4.10 schrieb:

    A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type[...]

    Soll da jetzt ein Widerspruch zu sehen sein? Das Zitat aus dem Standard sagt nicht, dass ein "null pointer value" durch eine Folge von Null-Bytes repräsentiert werden muss. Es sagt lediglich, dass ein konstanter Ausdruck mit Wert 0 zu einem "null pointer value" konvertiert werden kann -- wie auch immer man ein "null pointer value" repräsentiert. Genausowenig wird garantiert, dass eine Folge von Null-Bytes als double-Wert interpretiert 0 ergibt.

    void*  zeiger;
    double fkzahl;
    memset(&zeiger,0,sizeof(zeiger));
    memset(&fkzahl,0,sizeof(fkzahl));
    assert(zeiger==0); // <-- ist nicht garantiert
    assert(fkzahl==0); // <-- ist nicht garantiert
    
    zeiger = 0;
    fkzahl = 0;
    unsigend char zbyte = *reinterpret_cast<unsigned char const*>(&zeiger);
    unsigend char fbyte = *reinterpret_cast<unsigned char const*>(&fkzahl);
    assert(zbyte == 0u); // <-- ist nicht garantiert
    assert(fbyte == 0u); // <-- ist nicht garantiert
    

    ...weil die Repräsentierung von Zeigerwerten und Fließkommawerten nicht vorgeschrieben ist -- auch nicht, wie ein Nullzeiger oder der double-Wert 0.0 im Speicher liegt.

    Wenn Du im Standard dazu etwas findest und dies widerlegen kannst, lass ich mich gerne belehren.

    Gruß,
    SP



  • Da der OP ja bereits gesagt hat, dass das Ding nur aus int besteht ist die Sache doch hinfällig...


Anmelden zum Antworten