Array initialisieren [gelöst!]



  • Hi,

    wie kann ich ein Array dynamisch mit mehreren Werten initialisieren?

    Folgendes funktioniert:

    float a[] = {0.5, 0.2};
    

    Ich möchte aber das Array in Abhängigkeit von mehreren Bedingungen mit unterschiedlichen Werten initialisieren bzw. diese zuweisen. Das sollte etwa so aussehen:

    float *a;
    
    if(...)
       a = new float[] = {0.5, 0.2};
    else if(...)
       a = new float[] = {0.3, 0.8, 0.6, 0.1};
    else if(...)
       a = new float[] = {0.7, 0.6, 0.9};
    

    Wie ist so etwas möglich?

    Gruß

    Sharpie


  • Mod

    Das macht man mit new und delete. Das ist aber nicht unbedingt sehr anfängerfreundlich, weil man ziemlich aufpassen muss, das alles sauber abläuft. Früher oder später wird man sich als C++ Programmierer new und delete aber angucken müssen.

    Fürs Erste empfehle ich dir aber die Container aus der STL, z.B. std::vector. Die sind viel einfacher zu bedienen und man kann da schon sehr viel mit machen.



  • Mit C++-Standardmitteln geht das so nicht. Man kann zwar z.B. verschiedene konstante Arrays vordefinieren, und diese dann in Abhängigkeit einer Bedingung einen Pointer zuweisen, aber so richtig toll ist das nicht. Dabei geht z.B. leider auch die Größeninformation flöten.
    Schöner ist z.B. std::vector in Verbindung mit boost::assign::list_of
    Die doofe Lösung würde so aussehen (mit handverlesener Größeninfo):

    float const arr1[] = {0.5, 0.2};
        float const arr2[] = {0.3, 0.8, 0.6, 0.1};
        float const arr3[] = {0.7, 0.6, 0.9};
    
        //...
    
        struct Holder
        {
            std::size_t size;
            float const * arr;
        };
    
        //...
    
        Holder arr;
    
        if(condition1)
        {
            arr.size = 2;
            arr.arr = arr1;
        }
        else if((condition2)
        {
            arr.size = 4;
            arr.arr = arr2;
        }
        else
        {
            arr.size = 3;
            arr.arr = arr3;
        }
    

    Mit boost.assign könnte man das so machen:

    std::vector<float> vec;
    
        if(condition1)
        {
            vec = boost::assign::list_of(0.5)(0.2);
        }
        else if((condition2)
        {
            vec = boost::assign::list_of(0.2)(0.8)(0.6)(0.1);
        }
        else
        {
            vec = boost::assign::list_of(0.7)(0.6)(0.9);
        }
    


  • Also jetzt habe ich zwei Aussagen:

    Das macht man mit new und delete

    und

    Mit C++-Standardmitteln geht das so nicht.

    Was ist jetzt richtig? Falls es mit new und delete funktioniert, ist die Frage wie?

    Mit dem vector als alternative könnte ich mich anfreunden, aber eine zusätzliche Bibliothek möchte ich nicht verwenden, was ja mit "boost" der Fall wäre!

    Gibt es eine alternative dazu wie ich mehrere Werte auf einmal hinzufügen kann ohne jedes mal "push_back" oder ähnliches zu verwenden?


  • Mod

    Sharpie schrieb:

    Also jetzt habe ich zwei Aussagen:

    Das macht man mit new und delete

    und

    Mit C++-Standardmitteln geht das so nicht.

    Was ist jetzt richtig? Falls es mit new und delete funktioniert, ist die Frage wie?

    Tut mir leid, ich hatte nicht genau genug gelesen. Auf deine exakte Fragestellung gibt Tachyon die richtige Antwort.

    Mit dem vector als alternative könnte ich mich anfreunden, aber eine zusätzliche Bibliothek möchte ich nicht verwenden, was ja mit "boost" der Fall wäre!

    Gibt es eine alternative dazu wie ich mehrere Werte auf einmal hinzufügen kann ohne jedes mal "push_back" oder ähnliches zu verwenden?

    Es gibt verschiedene Methoden, um einem STL-Container eine Reihe von Werten zuzuweisen. Für gleichartige Werte und für Kopien kann man assign nehmen, für Werte die sich aus einer Funktion ergeben, kann man generate nehmen. Wenn man ganz frei Werte ohne Muster massenhaft zuweisen möchte, muss man sich das selber zusammenbauen oder wie von Tachyon vorgeschlagen etwas Fertiges wie boost::assign nehmen



  • Vielen Dank für die Hilfe. Ich habe es jetzt wie vorgeschlagen mit boost::assign erledigt!


Anmelden zum Antworten