Arrayinhalt auf 0 setzen



  • Mahlzeit,

    ich habe folgende Struktur:

    typedef struct {
        float min, max;
    } Interval;
    
    Interval        intervals[40]
    

    und ich moechte jetzt min und max von allen 40 Elementen auf 0.0f setzen. Wie geht das am besten?



  • Hi,

    memset oder for-Schleife.

    memset(intervals, 0, sizeof(intervals));
    
    for (int i = 0; i < sizeof(intervals) / sizeof(Interval); ++i)
    {
      intervals[i].min = 0.0f;
      intervals[i].max = 0.0f;
    }
    


  • Danke fuer die schnelle Antwort!

    funktioniert memset wirklich immer? Also ist sichergestellt, dass ein Bitmuster von 0000 auch 0.0f entspricht?

    Und ein einfaches Interval intervals[40] = { } geht in meinem Fall nicht, oder?



  • Nuller schrieb:

    funktioniert memset wirklich immer? Also ist sichergestellt, dass ein Bitmuster von 0000 auch 0.0f entspricht?

    Afaik nein. Im Zweifel die Schleife nehmen.



  • Also da müsste man aber schon eine extrem kaputte CPU haben dass 0000.. nicht 0.0f entspricht 😉
    Und

    float array[40] = {0};
    

    dürfte den gleichen Effekt wie memset haben.



  • Also ich hatte noch nie Probleme mit memset, solange es PODs sind 😉

    Auch in C++ nehm ich das hinundwieder 😉



  • dirty little helper schrieb:

    Also ich hatte noch nie Probleme mit memset, solange es PODs sind 😉

    Solange es was sind?


  • Mod

    POD=plain old data

    In C eigentlich ein ziemlich sinnloser Begriff, da alles POD ist. Die Unterscheidung spielt eine Rolle bei Sprachen mit komplexen Datentypen wie C++. Da hat man nämlich bestimmte Garantien für POD die man für andere Typen nicht hat. Deshalb spare ich mir auch mal die genaue Definition, denn die macht nur mit C++-Begriffen Sinn.

    edit: Und die Garantie das memset aller Bytes auf 0 einem Nullwert entspricht ist keine der Garantien von POD. Korrekterweise müsste man daher die floats von Hand auf 0 setzen. Man kann aber auch leicht eine Funktion zum Nullsetzen schreiben, die dann per bedingter Compilierung entweder memset benutzt (wenn es einer der üblichen Fließkommazahlenstandards ist) oder eben einzeln die Werte nullt (bei exotischen Systemen)



  • ja du hast natürlich recht. In C gibts ja garnichts anders als PODs.

    POD bedeutet grob gesagt, dass die Variablen der Struktur alle schön fein säuberlich hintereinander im Speicher aufgereiht sind.

    Das ist in C++ unter bestimmten Bedingungen nicht so.

    Bei einer POD-Struktur und Arrays einer solchen kann man also getrost mit der groben Kelle namens memset ( und auch memcpy ) drüberziehen 😉

    Hat man allerdings einen Pointer in der Struktur sollte man sich bewusst sein, dass auch der Pointer nur genullt wird und NICHT das Objekt was dahinter liegt.
    Das wäre dann ein Speicherleck 😃


  • Mod

    Eben nicht! memcpy kann man benutzen, aber memset nicht unbedingt. Für memset braucht man integrale Typen (und eventuell auch ein paar andere), aber Fließkommazahlen zählen nicht dazu. Pointer soweit ich weiß auch nicht.

    edit: memset auf Fließkommazahlen funktioniert natürlich auf 99.999% aller Implementierungen, aber ganz korrekt sollte man so etwas per Präprozessormakro prüfen und eventuell Alternativen bereitstellen.



  • Nuller schrieb:

    Und ein einfaches Interval intervals[40] = { } geht in meinem Fall nicht, oder?

    Doch, das geht (6.7.8 (21) im Standard), und es ist für mein Verständnis auch die sinnvollste Methode.


Log in to reply