Defaultwert Initialisierung



  • Hallo!

    Wenn ich folgenden Array dynamisch erstelle, dann werden die Einträge auf einen krummen Wert irgendwas hoch -61 initialisiert.

    double* test=new double[mem];

    Ich hätte aber gerne überall 0.0 drinstehen.
    Gibts da was besseres als anschließend

    for(int i=0;i<mem;++i)
    test[i]=0.0;

    MfG



  • new = du benutzt c++ !!!

    std::vector<double> test(50,0.0);
    

    😃

    Ciao ...



  • Einen Array kann man C-like initialisieren:

    memset(test, 0x00, mem * sizeof double);
    


  • double* arr = new double[CONSTANT]();
    


  • Hi desert pinguin,

    double* arr = new double[CONSTANT]();
    

    damit ist das Array aber immer noch nicht initialisiert !

    mfg JJ



  • John Doe schrieb:

    Hi desert pinguin,

    double* arr = new double[CONSTANT]();
    

    damit ist das Array aber immer noch nicht initialisiert !

    mfg JJ

    Naja... Eigentlich macht

    double* arr = new double[CONSTANT];
    

    und

    double* arr = new double[CONSTANT]();
    

    keinen Unterschied.
    In bieden Fällen sollte das Array initialisiert werden.
    Das besagt der Standard (ich bin nicht sicher 🙄 )



  • desert pinguin schrieb:

    In bieden Fällen sollte das Array initialisiert werden.
    Das besagt der Standard (ich bin nicht sicher 🙄 )

    Ne, nur globale und statische Variablen werden per Default mit 0 initialisiert. Alles andere wird defaultmässig nicht mit einem bestimmten Wert initialisiert.



  • Die leere Klammer hinter dem new-Operator macht bei .Net keinen Unterschied.

    Ich brauche auch noch einen dreidimensionalen Array mit Initialisierung..
    Kann man in einer Vektorkonstruktion direkt die drei Dimensionen bestimmen a la

    vector<vector<vector<double> > > test(dim1,dim2,dim3,init_wert)
    

    oder was mache ich da am besten

    Thanx



  • Noch eine moeglichkeit

    double s[CONSTANT] ={0.0};
    


  • John Doe schrieb:

    double* arr = new double[CONSTANT]();
    

    damit ist das Array aber immer noch nicht initialisiert !

    Wenn ich den Standard richtig lese aber schon!

    Zuerst mal brauchen wir den Begriff default initialization aus 8.5. Das bedeutet bei non-POD-Typen, dass der Konstruktor aufgerufen wird. Bei POD (wie double) bedeutet es Initialisierung mit Null (zero initialization).

    Dann zum new-Ausdruck in 5.3.4. Dort steht "If the new-initializer is of the form (), default initialization shall be performed"

    Vielleicht mag mir jemand zeigen, an welcher Stelle ich falsch liege.



  • Vielleicht mag mir jemand zeigen, an welcher Stelle ich falsch liege.

    Inhaltlich gar nicht. Will man aber ganz korrekt sein, dann muss man darauf hinweisen, dass es sich hier seit dem TC 1 nicht mehr um default- sondern um value-initialization handelt.
    Das neue Value initialization bedeutet für PODs aber genau soviel wie das alte default initialization ist also äquivalent zu zero initialization.
    Default Initialization für PODs ist dafür jetzt äquivalent zu keine Initialisierung.

    Auf jeden Fall sollte die Zeile

    double* arr = new double[CONSTANT]();
    

    alle CONSTANT doubles mit 0.0 initialisieren.



  • Hallo erstmal...

    double* test = new double[100]();
    double a = test[12];
    

    Dann müsste hier a den Wert 0.0 haben.
    Ich krieg aber a = -6.2774385622041925e+066 zurück.

    Ok, das ist schon nah an der 0 😉
    Aber so ganz dann doch nicht. 😞

    Oder mach ich da irgendwas grundlegend falsch... 😕



  • meinst du das:

    double* test = new double[100];
    

    aber denke daran, daß das Array noch nicht initialisiert ist!! Ihm wird nur Speicher zugewiesen; da steht noch irgendein 'Schrott' drin;-))



  • Speicher freigeben nicht vergessen!!!!!!

    delete []test;
    


  • freshman schrieb:

    meinst du das:

    double* test = new double[100];
    

    Nein, er meint das, was in seinem Posting steht.



  • müsste das nich ne 0 initialisierung machen?

    double* test = new double[100](0);//<--da 
    double a = test[12];
    


  • DJGPP 3.3.3 kann das jedenfalls nicht 😞



  • @otze: error C2538: new : cannot specify initializer for arrays
    @all: sorry für meinen nonsense 😞



  • jo geht echt nich...

    double* test = new double[20];
        ZeroMemory(test,sizeof(double)*20);
        delete[] test;
    

    so klappts aber(aber leider nur da, wo die windows.h is :() 🙄



  • Ich hab das ganze mal mit ein paar Compilern von MS probiert, und das folgende kam dabei heraus:

    VC++ 6: Initialisierung findet nicht statt,
    VC++ 7.1 & VC++ 8: Initialisierung erfolgt beim Aufruf mit ...()

    Also denk ich wohl, dass ein standardkonformer Compiler die Initialisierung schon ausführt.


Anmelden zum Antworten