dynamische Arrays



  • OBJS=new float5D(numOBJ,float4D(MaxFrames, float3D(MaxVertices/3,float2D(3, float1D(3,0)))));
    

    numOBJ kenne ich hier schon, aber MaxFrames und MaxVertices noch nicht.

    Die werden für jedes Objekt einzeln bestimmt, also unterschiedlich groß.

    Geht so was überhaupt mit Vektor ?



  • Joa, klar.



  • und wie mache ich dass das zweite element (zweite klammer [] halt) verschieden groß sein kann ?



  • #include <vector>
    
    int main ()
    {
     std::vector<std::vector<int> > v(2,std::vector<int>());
     v[0].push_back (2);
     v[0].push_back (3);
     v[1].push_back (1);
    }
    

    Da hat das erste Element (ein vector von int) 2 weitere Elemente (2 ints) und der zweite lediglich eines (1 int).

    Das kannst du jetzt natürlich beliebig verländern, indem du diesen vector nochmal in einen vector packst usw. Aber ob das viel Sinn macht sei mal dahingestellt.



  • Was genau macht "push_back" ?

    Und wie wäre das in meinem Beispiel ?

    1. variabel + bekannt
    2. 3. variabel eins nach dem anderen bekannt
    4. 5. fix

    🙂



  • DarkShadow44 schrieb:

    Was genau macht "push_back" ?

    Und wie wäre das in meinem Beispiel ?

    1. variabel + bekannt
    2. 3. variabel eins nach dem anderen bekannt
    4. 5. fix

    🙂

    ein wenig eigeninitiative wird auch hier verlangt:
    http://www.cplusplus.com/reference/stl/vector/
    dort steht nen link zu dem, was genau push_back macht...

    versuch doch selbst mal was und frag dann noch mal!?

    bb



  • Hab's geschafft ^^

    Und wie wandle ich vector in Array um ?

    ich nutze

    int i;
    
    for(i=0;i<numOBJ;i++)
    {
    //float Array[20]={0,0,0,1,0,   0,0,2,2,0,   0,0,0,0,0};
    	float* Array=new float[MaxVertices[i]*5];
    	//Array=new MaxVertices
    
    	int ii;
    	for(ii=0;ii<MaxVertices[i]*5;ii++)
    	{
    		Array[ii]=(*LoadVertices)[i][ii];
    	}
    	glInterleavedArrays( GL_T2F_V3F, 0,Array);
    
    	glDrawArrays( GL_TRIANGLES, 0, MaxVertices[i] );
    
    	delete Array;
    }
    

    um mein Model anzuzeigen...
    Aber jedes mal 200 Arrays erstellen ist langsamer...

    Wie konvertiere ich den vector für "glInterleavedArrays" ?

    Und ist es besser (Performance) wenn ich ein model mit 1000 Vertices rendere, oder wenn ich (wie oben, nur abgesehen von den vielen Arrays) 20 models mit 50 Vertices rendere ??



  • Wie kann man denn in einem Post so viel falsch machen? xP

    Und wie wandle ich vector in Array um

    wenns sein müsste, dann tust du das so:
    std::vector<T> other = to_copy;
    wenn du ein C-array brauchst:

    T* other = new T[to_copy.size()];
    std::copy(to_copy.begin(), to_copy.end(), other);
    /*...*/
    delete[] other;
    

    das willst du aber gar nicht wissen 😛

    ich nutze
    [schrecklichen C/C++ Code, aber nehm lieber Code-Tags statt die dafür vorgesehenen C/C++ Tags]
    um mein Model anzuzeigen...

    Wie konvertiere ich den vector für "glInterleavedArrays" ?

    Gar nicht - weil du das nicht brauchst...

    Und ist es besser (Performance) wenn ich ein model mit 1000 Vertices rendere, oder wenn ich (wie oben, nur abgesehen von den vielen Arrays) 20 models mit 50 Vertices rendere ??

    Müsstest du wohl messen, wenn dus wirklich wissen willst...
    Ich könnte mir vorstellen, dass es (vernachlässigbar) schneller ist das eine model mit 1000vertices zu rendern...

    zum code(wo ziemlich viele Deklarationen fehlen, so kann ich nur raten, welche fkt was erwartet und welche variable welchen typen und inhalt hat)
    also hier nen vereinfachter quellcode:

    void foo(float *Array, int length) { /*...*/ }
    
    #include <vector>
    
    int main()
    {
      std::vector<float> Array;
    
      Array.push_back(3.f);
      Array.push_back(0.f);
      Array.push_back(1.f);
      Array.push_back(4.f);
      Array.push_back(1.f);
      Array.push_back(5.f);
      Array.push_back(9.f);
      Array.push_back(2.f);
      Array.push_back(6.f);
    
      foo(&Array[0], Array.size());
    //oder
      foo(&*Array.begin(), Array.size());
    }
    

    allerdings gibt size eben nen size_type (idR std::size_t) zurück und wir wollen "nur" nen int haben - so was sollte man eigtl vermeiden (wenn z.bsp. 2^32 elemente im vector sind und int nur 2^32 versch. werte darstellen kann wird z.bsp. bei nem cast 0 draus...
    da müsste man sich noch was einfallen lassen, wenn so was passieren könnte aber nicht soll 😉

    bb



  • Sor
    ry, ich dachte Code wäre Code 😮

    LoadVertices ist ein 2D Vektor aus "float", [Objektnummer][Koordinate / UV-Koordinate]

    MaxVertices ist ein 2D Vektor aus "int", [Objektnummer] -> Vertexanzahl des Objektes

    Wenn ich

    &*LoadVertices[i].begin()
    

    benutze kommt dieser Fehler:

    _SCL_SECURE_VALIDATE(_Pvector == NULL || (((_Myvec *)_Pvector)->_Myfirst <= _Ptr && _Ptr <= ((_Myvec *)_Pvector)->_Mylast));
    

    wenn ich

    &(*LoadVertices)[i].begin()
    

    benutze, kommt nur ein komischer Mix aus Rosa und Weiß raus ( drei viertel rosa oder weiß)...



  • Wie kann ich den vector jetzt als Array übergeben ?



  • Du übergibst einen Zeiger auf das erste Element des Vektors:

    const float* data = &floatvector[0];
    


  • DarkShadow44 schrieb:

    Wie kann ich den vector jetzt als Array übergeben ?

    wo liegt denn das problem? Ich hab dir doch oben beide (sinnvollen) Möglichkeiten aufgeschrieben?!

    bb



  • Danke,
    "glDrawArrays" nimmt scheinbar nicht nur float pointer sondern auch vector-pointer 😃

    mit "begin" sird er nicht als float angenommen, aber egal.

    Jetzt gehts:

    const float* data = &(*LoadVertices)[i][0];
    


  • DarkShadow44 schrieb:

    Danke,
    "glDrawArrays" nimmt scheinbar nicht nur float pointer sondern auch vector-pointer 😃

    mit "begin" sird er nicht als float angenommen, aber egal.

    Jetzt gehts:

    const float* data = &(*LoadVertices)[i][0];
    

    du solltest ja auch nicht nur begin nehmen - da ist klar, dass er es nicht kann - deshalb hab ich ja auch foo(&*Array.begin(), Array.size()); geschrieben. aber egal^^

    std::vector &iter_vec = LoadVertices[i];
    const float* data = &*iter_vec.begin();
    

    bzw.

    std::vector &iter_vec = LoadVertices[i];
    const float* data = &iter_vec[0];
    

    so was in der Richtung würd ich vorschlagen - so erkennt wenigsten noch jmd, was du dort machst - und langsamer ists auch nicht...

    bb


Anmelden zum Antworten