Vector in Array umwandeln


  • Mod

    sizeof(vertices) ist bei einem std::vector so etwas wie 3*Pointergröße. Du musst schon die wirkliche Größe der Daten nehmen, so wie du es in Zeile 2 deines Versuches komischerweise schon getan hast (sogar augenscheinlich richtig).

    edit: Zu langsam.



  • Bei deinem momentanen Versuch verbirgt sich der Fehler bei sizeof(vertices). sizeof(vertices) gibt dir die Größe eines Objekts der vector Klasse an (d.h. alle Member-Variablen). Das enthaltene Array wird dabei nur als einzelner Zeiger mitgezählt, dessen Länge also nicht mit einberechnet.

    Deswegen: sizeof(typ der in deinem vector gespeichert wird) * vertices.size();



  • Habs gemerkt.

    Lösung:

    // create a vertex buffer interface called v_buffer
        d3ddev->CreateVertexBuffer(sizeof(CUSTOMVERTEX) * vertices.size(),
                                   0,
                                   CUSTOMFVF,
                                   D3DPOOL_MANAGED,
                                   &v_buffer,
                                   NULL);
    
        void* pVoid;    // a void pointer
    
        // lock v_buffer and load the vertices into it
        v_buffer->Lock(0, 0, (void**)&pVoid, 0);
    	memcpy(pVoid, vertices.data(), sizeof(CUSTOMVERTEX) * vertices.size());
        v_buffer->Unlock();
    

    Ich ging davon aus, dass sizeof(CUSTOMVERTEX) * vertices.size() gleichgroß wie sizeof(vertices) ist, dem war aber nicht so!

    Danke!



  • sagenwoller schrieb:

    Bitte verwende nicht &*vec.begin() oder &vec[0] , da das nicht geht, wenn dein Vektor leer ist.

    .data gibt es aber erst ab C++2011.

    (vec.empty() ? 0 : &vec[0])
    kann man noch schreiben in C++98.



  • Die erinnerung schrieb:

    Ich ging davon aus, dass sizeof(CUSTOMVERTEX) * vertices.size() gleichgroß wie sizeof(vertices) ist, dem war aber nicht so!

    Nö, dem ist auch nicht so; denn std::vector speichert den Kram indirekt.



  • krümelkacker schrieb:

    Nö, dem ist auch nicht so; denn std::vector speichert den Kram indirekt.

    Wenn ich das vorher gewusst hätte, aber man lernt eben täglich dazu...


  • Mod

    krümelkacker schrieb:

    Die erinnerung schrieb:

    Ich ging davon aus, dass sizeof(CUSTOMVERTEX) * vertices.size() gleichgroß wie sizeof(vertices) ist, dem war aber nicht so!

    Nö, dem ist auch nicht so; denn std::vector speichert den Kram indirekt.

    Woarus übrigens folgt, dass vector hier wahrscheinlich gar nicht die richtige Datenstruktur ist. Wenn du vorher ein statisches Array hattest, dann wäre std::array (oder std::tr1::array bei älteren Compilern) das C++-Äquivalent. std::vector ist das was in C malloc war (oder auch für die gute alte Technik, wo man in C einfach eine große Zahl als Arraygröße genommen hat und gehofft hat, dass niemand über das Maximum geht.)



  • Ja ne, ich will ja nach und nach Daten rein schreiben...

    Deshalb habe ich Vector genommen, da meines Wissens sich ein std::Array nicht erweitern lässt. Und falls das doch gehen sollte, ich bin mit Vector ganz zufrieden...


  • Mod

    Die erinnerung schrieb:

    Ja ne, ich will ja nach und nach Daten rein schreiben...

    Deshalb habe ich Vector genommen, da meines Wissens sich ein std::Array nicht erweitern lässt. Und falls das doch gehen sollte, ich bin mit Vector ganz zufrieden...

    Dann ist vector schon richtig.



  • Die erinnerung schrieb:

    krümelkacker schrieb:

    Nö, dem ist auch nicht so; denn std::vector speichert den Kram indirekt.

    Wenn ich das vorher gewusst hätte, aber man lernt eben täglich dazu...

    Auch ohne die Implementierung von std::vector zu kennen, ergibt sich das schon daraus, dass sizeof grundsätzlich eine zur Kompilierzeit bekannte Konstante liefert (von VLAs mal abgesehen, aber die gehören auch nicht zu Standard-C++).



  • Athar schrieb:

    Auch ohne die Implementierung von std::vector zu kennen, ergibt sich das schon daraus, dass sizeof grundsätzlich eine zur Kompilierzeit bekannte Konstante liefert

    Das wäre mir neu...





  • Ok. Wie ja gesagt ist mir neu. ich dachte, bis her immer, dass das in Runtime-Operator ist, da sich unter umständen die Größe eines Objekts ändern kann...



  • Die erinnerung schrieb:

    [...] da sich unter umständen die Größe eines Objekts ändern kann...

    Unter welchen Umständen könnte das passieren?



  • Ich dachte es wäre möglich. Z.B.: Vector, aber wie ich jetzt weiß, ändert der seine Größe nicht. Wie ja gesagt, ich dachte...


  • Mod

    Die erinnerung schrieb:

    Ich dachte es wäre möglich. Z.B.: Vector, aber wie ich jetzt weiß, ändert der seine Größe nicht. Wie ja gesagt, ich dachte...

    Gehen wir mal zu C:

    int *ptr;
    sizeof(ptr); // Meistens 4 oder 8
    ptr = malloc(1000000);
    sizeof(ptr); // Immer noch 4 oder 8
    

    Nun klar?


Anmelden zum Antworten