Array mit bliebig festgelegten Zahl an Feldern
-
Ich hab es jetzt wie folgt gemacht:
#include <vector> using namespace std; struct Vertex { float x, y, z; // Position of vertex in 3D space DWORD color; // Color of vertex }; vector<Vertex> g_lineStrip;Doch nun habe hier ein Problem:
g_pLineStrip_VB->Lock( 0, sizeof(g_lineStrip), (void**)&pVertices, 0 ); memcpy( pVertices, g_lineStrip, sizeof(g_lineStrip) ); g_pLineStrip_VB->Unlock();Mein Kompiler sagt folgendes:
.\main.cpp(388) : error C2664: 'memcpy': Konvertierung des Parameters 2 von 'std::vector<_Ty>' in 'const void *' nicht möglich
1> with
1> [
1> _Ty=Vertex
1> ]
1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werdenWie schreibe ich so einen Operator für diese Konvertierung ?
-
Du solltest dich besser von diesen Low-Level Sachen lossagen, und gleich Sachen wie std::copy nutzen - Das funktioniert dann auch bei Vektoren.
-
Wie kann ich den diese Direct3D-Funktion mit str::copy verwenden...
Mein Problem ist einfach folgendes:
Ich habe eine unbekannt Anzahl von Wert (x,y,z) und diese will ich mit Direct3D mit einem Linestrip ausgeben. Bin gerne bereit das anders zu machen - die Frage ist nur wie.
-
Schau dir mal im C++-Buch deiner Wahl den Abschnitt zur STL (Standard Template Library) an, mach dich mit Containern, Iteratoren udn Algorithmen vertraut. danach sollte das eigentlich kein Problem sein. Und nutze bitte nie nie nie memcpy Bei Speicher der mit Objekten belegt ist. In 10% der Faelle ists mehr als fragwuerdig, eher unschoen und ekelhaft. Und in 90% gehts gnadenlos schief und zerreisst dir die Konsistenz der Klassen die du da initialisierst. Bei jeder Klasse die intern Speicher allokiert besitzt jedes Objekt diesen Speicher und gibt ihn auch wieder frei. Mit memcpy sorgst du dafuer dass zwei Objekte den selben Speicher besitzen, spaetestens wenn das zweite Objekt zersoert wird krachts.
-
Könnt ihr mir nicht irgendwie dabei helfen...
In keine C++ Buch, dass ich besitze steht dazu was. Ich weiß wirklich nicht mehr weiter. Den Code den ich hatte (von jmd. anderen kopiert) funktionierte mit Vertex in Form von Arrays, daraus habe ich nun Vektoren gemacht... daher gab es eine Fehler mit memcop. Dass hab ich jetzt versucht mit copy zu lösen... geht aber irgendwie nicht.Mein Code, sieht nun wie folgt aus. Es kommt zwar keine Fehlermeldung mehr aber es wird nichts angezeigt.
void init( void ) { g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ); D3DDISPLAYMODE d3ddm; g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ); D3DXMATRIX matView; D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3(0.0f, 0.0f,-10.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f ) ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian( 45.0f ), 1.0f, 1.0f, 10000000.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj ); g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); vector<Vertex> pVertices (g_lineStrip.size()); // // Line Strip // g_pd3dDevice->CreateVertexBuffer( (g_lineStrip.size()-1)*sizeof(Vertex), 0, D3DFVF_MY_VERTEX, D3DPOOL_DEFAULT, &g_pLineStrip_VB, NULL ); g_pLineStrip_VB->Lock( 0, sizeof(g_lineStrip),(void**) &pVertices, 0 ); copy(g_lineStrip.begin(),g_lineStrip.end(),pVertices.begin()); g_pLineStrip_VB->Unlock(); }void render( void ) { g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(1.0f,1.0f,1.0f,1.0f), 1.0f, 0 ); getRealTimeUserInput();updateViewMatrix();
g_pd3dDevice->BeginScene();
D3DXMATRIX mWorld;
D3DXMatrixTranslation( &mWorld, 0.0f, 0.0f, 5.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &mWorld );//g_pd3dDevice->SetStreamSource( 0, g_pLineStrip_VB, 0, sizeof(Vertex) );
g_pd3dDevice->SetFVF( D3DFVF_MY_VERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_LINESTRIP, 0, sizeof(g_lineStrip)-1);g_pd3dDevice->EndScene();
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du musst ueberhaupt kein Array anlegen, wenn das legt ja DX ehh schon an. Also kannst du die Daten auch direkt da hinein schreiben, statt selbst noch ein zweites Array zu erstellen, die Daten da rein zu tun und dann alles in das andere Array zu kopieren. Das ist doch Schwachsinn. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Kannst du mir konkret sagen wie es geht... ich es einfach nicht, selbst wenn es für dich offensichtlich ist.
-
Ganz einfach! Du machst Lock auf den Buffer und als Rueckgabewert bekommst du einen Zeiger auf dein Array. Da schreibst du deine Datein rein. Dann wieder Unlock aufrufen. Fertig. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
TGGC schrieb:
Ganz einfach! Du machst Lock auf den Buffer und als Rueckgabewert bekommst du einen Zeiger auf dein Array. Da schreibst du deine Datein rein. Dann wieder Unlock aufrufen. Fertig. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
Ich hab irgendwo gelesen, dass die größe eines Arrays definiert werden muss und damit dieser nicht variabel ist. Wo wird da die Größe dieses Array beschrieben ?
Und wie bekomme ich in den Array dann variabel viele Daten hinein ?
Ich glaube ich sehe irgendwie den Wald vor lauter Bäumen nicht...

Kannst du mir mal diese paar Zeilen zwischen Buffer aufruf mit Lock und Unlock aufschreiben und wie man in den Array dann die Daten aus den Vector reinschreibt.
Ich wäre dir sehr verbunden

Danke schon mal für die Antworten !
Mfg pressure
-
Die Groesse des Arrays gibt man nicht bei Lock sondern schon beim Erstellen des Buffers an. Dabei kannst du ja aber eine quasi beliebige Zahl angeben. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Vertex *pVertices = NULL; // // Line Strip // g_pd3dDevice->CreateVertexBuffer( g_lineStrip.size()*sizeof(Vertex), 0, D3DFVF_MY_VERTEX, D3DPOOL_DEFAULT, &g_pLineStrip_VB, NULL ); g_pLineStrip_VB->Lock( 0, g_lineStrip.size()*sizeof(Vertex), (void**)&pVertices, 0 ); for(unsigned i = 0;i < g_lineStrip.size();i++) { pVertices[i].x = g_lineStrip[i].x; pVertices[i].y = g_lineStrip[i].y; pVertices[i].z = g_lineStrip[i].z; pVertices[i].color = g_lineStrip[i].color; } g_pLineStrip_VB->Unlock();Ist es so richtig...

Ich bekomme weder Fehlermeldung noch den Linestripangezeigt.
-
Fuer die Anzeige des Linestrips ist da ja auch kein Code. Also funktioniert alles wie es sollte. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
Ah...
ich hatteg_pd3dDevice->SetStreamSource( 0, g_pLineStrip_VB, 0, sizeof(Vertex) );auskommentiert. Jetzt funktioniert es, Danke !