Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.09.2009, 16:42

gibt es sowas wie memcat?

gibt es eine Funktion, die mir zwei Speicherbereiche "verbindet" ? So wie Strcat bei Zeichenketten.

genauer gesagt : Ich will neue vertices in meinen schon bestehenden VertexBuffer kopieren ohne das der alte Inhallt verlohren geht. Dazu muss ich doch irgendwie die alten Daten auslesen, mit den neuen Vertices zu einer Liste zusammenfügen und dann wieder in den neuen VertexBuffer kopieren.

Nach langem Googeln weiss ich nicht mehr weiter, wie ich 2 Speicherberiche zu einem machen kann

Weiss einer Rat ? :?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

17.09.2009, 16:44

Es gibt natürlich keine solche Funktion weil du nicht einfach so "2 Speicherbereiche zu einem machen" kannst, wie stellst du dir vor soll das gehen!? Bei strcat() musst du der Funktion bereits einen Speicherbereich übergeben der groß genug ist um beide strings aufzunehmen, die kopiert dann nur den einen string hinter den anderen und tut nicht irgendwie magisch "2 strings zu einem machen" ;)

Warum kannst du nicht einfach im bestehenden Vertexbuffer nur den Bereich den du updaten willst updaten!?
Beschreib vielleicht etwas genauer was du eigentlich machen willst...

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

3

17.09.2009, 17:18

Mal kurz in pseudocode:

Quellcode

1
2
3
4
5
6
7
8
9
// Deine Speicherbereiche und deren größe
char* speicherA; 
char* speicherB; 
int sizeA;
int sizeB;

char* speicherC = new char[sizeA+sizeB]; // Erzeuge speicher der groß genug ist für beide
memcpy(speicherA, speicherC, sizeA); // Kopiere den ersten Speicherbereich
memcpy(speicherB, speicherC+sizeA, sizeB); // Kopiere den zweiten Speicherbereich dahinter

4

17.09.2009, 18:48

std::vector ftw!!!
Lieber dumm fragen, als dumm bleiben!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

17.09.2009, 20:42

Wenn man Standardcontainer benutzt, dann ist das relativ einfach:

http://www.cplusplus.com/reference/algorithm/merge/

6

17.09.2009, 20:56

Bei den STL-Containern kann man auch die insert()-Überladung verwenden, welche eine Iterator-Range nimmt. Also sozusagen einen Container in einen anderen einfügen. Bei std::list geht das mit splice() besonders effizient und exceptionsicher, da tatsächliche Move-Semantik genutzt wird.

Du solltest dir unbedingt angewöhnen, Low-Level-Zugriffe zu abstrahieren, denn ständiges Arbeiten auf rohem Zeiger ist sehr fehleranfällig! Die STL ist hier ein guter Anlaufpunkt, aber je nach Anwendungsbereich kann man die Funktionalität auch in eigenen Klassen kapseln.

7

18.09.2009, 01:53

Danke erstmal ! Ich lese mich jetzt erstmal in die STL-Programmierung ein scheint ja doch einige zu können.

Aber vieleicht ist meine Vorgehensweise nicht die Richtige. Was meinst du genau mit dieser Aussage ?

Zitat von »"dot"«


Warum kannst du nicht einfach im bestehenden Vertexbuffer nur den Bereich den du updaten willst updaten!?
Beschreib vielleicht etwas genauer was du eigentlich machen willst...


Ich habe bei msdn keine passenden Methoden für den Vertexbuffer gefunden um vertices zu updaten bzw. anzuhängen.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

18.09.2009, 17:17

Also bei einem VertexBuffer ist der Speicher bereits allokiert und daher kann der nicht so dynamisch sein, wie du es dir vorstellst.

Allerdings kannst du einen VertexBuffer erzeugen, der etwas Grösser ist und dann einfach nicht den ganzen benutzen. Und wenn du da jetzt noch etwas reinschieben willst, dann machst du das, indem du ihn lockst (aber halt nicht alles verwirfst) und fängst mit dem Einfügen dort an, wo du vorhin aufgehört hast. (siehe IDirect3DVertexBuffer9::Lock)

9

18.09.2009, 18:43

ahhh sehr gut ... ich wusste garnicht das ich einen bestimmten Bereich sprerren kann und dieser dann nicht überschrieben wird ... danke!

Werbeanzeige