Vector in Array umwandeln
-
Du hast doch sizeof(vertices) oben angepasst, warum also nicht unten?
// a void pointer
Prima Kommentar, so nebenbei.
-
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ß wiesizeof(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ß wiesizeof(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...
-
krümelkacker schrieb:
Die erinnerung schrieb:
Ich ging davon aus, dass
sizeof(CUSTOMVERTEX) * vertices.size()
gleichgroß wiesizeof(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...
-
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...
-
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?