Vector in Array umwandeln



  • Ich arbeite gerade mit DirectX und habe eine Funktion, die ein Array als Argument benötigt.
    Jetzt ist es aber leider so, dass eine Funktion Daten als Array benötigt und ich aber lieber die Daten mit einem vector zusammensammele.

    Wie kann ich einen Vector in ein Array umwandeln?



  • foo(&*vec.begin(),vec.size());



  • foo(vec.data(),vec.size());
    


  • ???

    Was wollt ihr mir damit sagen?



  • Sie wollten sagen, dass wenn du eine Funktion hat, die so aussieht:

    void foo (int *data, size_t len);
    // oder
    void foo (int data[], size_t len);
    
    // und einen Vektor
    vector<int> vec;
    

    dann rufst du sie so aus: foo(vec.data(), vec.size());
    vec.data() ist sozusagen die Konviertierungsfunktion Vektor->Array (aka Pointer), vec.size() gibt dir die Länge, die du bei solchen Funktionen meistens brauchst.

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



  • Geht leider nicht.

    (Also vec.data() und nach der Länge wird nicht gefragt.)

    Hab ich schon ausprobiert...

    Muss doch anders gehen, oder?



  • Was soll "geht nicht" denn für eine Problembeschreibung sein?


  • Mod

    Wie soll eine Funktion ein Array erwarten, dessen Länge es nicht kennt? Ist die Länge fest vorgegeben? Warum geht data nicht? Bitte drück dich genauer aus, wenn du Hilfe möchtest. Mit über 200 Beiträgen sollte man so langsam mal mitbekommen haben, wie man Fragen richtig stellt.



  • Ich übergebe die Größe in Bytes

    Fehlerbeschreibung:

    Es wird nichts angezeigt.

    Ich versuche ein Quadrat zu zeichnen.

    Die Punkte sind:
    pos[0]: 0.5 0.5 0.5
    pos[1]: -0.5 0.5 0.5
    pos[2]: 0.5 0.5 -0.5
    pos[3]: -0.5 0.5 -0.5

    Und ich verbinde:

    1, 3, 2
    1, 2, 0

    Wenn ich das von Hand über die arrays mache, dann erhalte ich mein Quadrat, aber wenn ich das per Code über die Vectoren machen lasse, dann ist mein Bild schwarz. (Und wie ich kontrolliere, ob die Koordinaten stimmen, die ich verbinde)

    Das ist das Problem!

    EDIT:

    Und ich weiß, wei man Fragen stellt. Deshalb habe ich gerfragt, wie man einen Vector in ein Array umwandelt.
    ich wusste nämlich, dass es wieder so enden wird, wenn ich mehr Infos als nötig herausgebe. ich habe schon alles in meinem Wissen stehende getan, aber nichts brachte die Lösung. Deshalb habe ich nach der direkten Lösung meienes Problems gefragt, ohne die Geschicht drumrum.



  • Kannst du einfach mal die Funktion posten, die du aufrufen willst? Der Punkt ist, dass du nicht umwandeln musst, da Vector intern schon ein Array hat, auf das du von aussen auch zugreifen kannst. Wenn du die Funktion postest, können wir dir die Lösung einfach so angeben.



  • ok.

    Hier der normale Aufruf:

    // create a vertex buffer interface called v_buffer
        d3ddev->CreateVertexBuffer(sizeof(vertices),
                                   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, sizeof(vertices));
        v_buffer->Unlock();
    

    vertices ist das Array. ich würde aber lieber einen Vector verwenden.
    Und ich verwende DirectX 9.
    (Win XP halt...)

    P.S.:

    Mein Momentner Versuch:

    // 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(vertices));
        v_buffer->Unlock();
    

    Er macht einfach nix!



  • Du hast doch sizeof(vertices) oben angepasst, warum also nicht unten?

    // a void pointer

    Prima Kommentar, so nebenbei.


  • 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...


Anmelden zum Antworten