Konstruktor nur 1-mal ??
-
Wenn man eine Klasse erstellt
z.B.
dreieck *dre;
dreieck *dre2dre = new dreieck(a,D3D_Device);
dre2 = new dreieck (b, D3D_Device);läuft der den Konstruktor bei mir nur bei "dre"-variabel ab!!
Das kann doch nicht sein kann mir da vielleicht einer helfen !!!Gruß Soulfly
-
Das kann echt nicht sein. Wie überprüfst oder siehst Du, dass der Konstruktor arbeitet?
-
Im Debug Modus halt!!
gehe von erste Zeile halt mal ganz durch und beim ersten mal geht der in den Konstr. rein und beim zweiten spring er drüber!!(man merkt es weil deswegen auch die Speicherallokierung die in den Konstruktor "normalerweise" erzeugt wird nicht gegeben ist --> stürzt nachher beim zugriff ab !!!
-
Hier der Code - Noch nicht alle Funktionen fertig aber mit einem Dreieck geht es:
aaa und bbb sind zwei dreieck und beim zweiten dreieck läd der Konstr. halt nicht
hier mal die main.cpp Datei
#include <d3dx8.h> #include <mmsystem.h> #include "resource.h" #include "primitiv.h" #pragma comment(lib, "d3dx8.lib") #pragma comment(lib, "d3d8.lib" ) #pragma comment(lib, "winmm.lib") dreieck *aaa; // Dreieck 1 dreieck *bbb; // Dreieck 2 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) HWND handle = NULL; // Fensteradresse BOOL keys[256]; // Mit diesem Array behandeln wir Tastenereignisse BOOL bActive = FALSE;// Aktivitätsstatus des Programms LPDIRECT3D8 D3D_Object = NULL; // Hauptobjekt von D3D LPDIRECT3DDEVICE8 D3D_Device = NULL; // Schnittstelle zw. D3D und Hardware LPDIRECT3DVERTEXBUFFER8 D3D_VertexBuffer = NULL; #define WIN_LEFTX 0 // Linke X-Koordinate #define WIN_LEFTY 0 // Linke Y-Koordinate #define WIN_WIDTH 300 // Breite #define WIN_HEIGHT 300 // Höhe LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ); BOOL Init(); BOOL SetGeometry(); VOID SetMatrices(); VOID Destroy(); VOID Render(); BOOL Init() { if (NULL==( D3D_Object = Direct3DCreate8( D3D_SDK_VERSION ))) return FALSE; D3DDISPLAYMODE d3ddm; if( FAILED( D3D_Object->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ))) return FALSE; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; if( FAILED( D3D_Object->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &D3D_Device ))) { return FALSE; } D3D_Device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); D3D_Device->SetRenderState( D3DRS_LIGHTING, FALSE ); return TRUE; } VOID Destroy() { if( D3D_VertexBuffer != NULL) D3D_VertexBuffer->Release(); if( D3D_Device != NULL) D3D_Device->Release(); if( D3D_Object != NULL) D3D_Object->Release(); } BOOL SetGeometry() { TVertex3 v[3]; // Vertex-Array für das Dreieck TVertex3 k[3]; // 1. Eckpunkt v[0].vecPos = D3DXVECTOR3(-1,-1, 0); // Ortsvektor v[0].col = D3DCOLOR_XRGB(0,0,255); // Farbe // 2. Eckpunkt v[1].vecPos = D3DXVECTOR3( 0, 1, 0); // Ortsvektor v[1].col = D3DCOLOR_XRGB(0,0,255); // Farbe // 3. Eckpunkt v[2].vecPos = D3DXVECTOR3( 1,-1, 0); // Ortsvektor v[2].col = D3DCOLOR_XRGB(0,0,255); // Farbe aaa = new dreieck(v, D3D_Device); // Werte Übergeben // 1. Eckpunkt k[0].vecPos = D3DXVECTOR3(-3,0, 0); // Ortsvektor k[0].col = D3DCOLOR_XRGB(0,0,255); // Farbe // 2. Eckpunkt k[1].vecPos = D3DXVECTOR3( -2, -1, 0); // Ortsvektor k[1].col = D3DCOLOR_XRGB(0,0,255); // Farbe // 3. Eckpunkt k[2].vecPos = D3DXVECTOR3( 3,0, 0); // Ortsvektor k[2].col = D3DCOLOR_XRGB(0,0,255); // Farbe //Problem stelle/////////////////////////////////////////////// bbb = new dreieck(k, D3D_Device); // Werte Übergeben return TRUE; } VOID SetMatrices() { D3DXMATRIX matView; D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-10.0f ), &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), &D3DXVECTOR3( 0.0f, 1.0f, 0.0f )); D3D_Device->SetTransform( D3DTS_VIEW, &matView ); D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); D3D_Device->SetTransform( D3DTS_PROJECTION, &matProj ); } VOID Render() { D3D_Device->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); D3D_Device->BeginScene(); SetMatrices(); aaa->trans(D3DXVECTOR3(1.0,1.0,1.0),D3DXVECTOR3(0.0,0.0,0.0),0.001f,0.00f,0.00f); aaa->render(); bbb->render();/////////////////Hier stürzt der dann ab weil ///bbb ja nicht richtig initialisiert /////////////////wurde D3D_Device->EndScene(); D3D_Device->Present( NULL, NULL, NULL, NULL ); } INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { WNDCLASS wc; wc.hInstance = hInst; // Handle der Instanz wc.lpszClassName = "MyWin"; // Name der Fensterklasse wc.lpfnWndProc = MsgProc; // Die Fensterroutine zum Verarbeiten von Meldungen wc.style = 0; // Standard Fenster wc.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));// Icon wc.hCursor = 0; // Keinen besonderen Cursor wc.lpszMenuName = NULL; // Kein Menü wc.cbClsExtra = 0; // Keine Keine Extras wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // Fenster weiß färben RegisterClass( &wc ); RECT rc; SetRect(&rc,0,0,WIN_WIDTH,WIN_HEIGHT); AdjustWindowRect(&rc,WS_SYSMENU,TRUE); handle = CreateWindow( "MyWin", // Name der Fensterklasse "Tutorial3 - Das erste Dreieck", // Titel WS_OVERLAPPEDWINDOW, // Fensterstil, hier ganz normal WIN_LEFTX, // obere Ecke X WIN_LEFTY, // obere Ecke Y (rc.right - rc.left), // Breite (rc.bottom - rc.top ), // Höhe GetDesktopWindow(), // Als Desktopfenster, kein Elternfenster NULL, // kein Menü wc.hInstance, // Handle der Klasseninstanz NULL ); if ((handle != NULL) && Init() && SetGeometry()) bActive = TRUE; else bActive = FALSE; if (bActive) { ShowWindow( handle, SW_SHOWDEFAULT ); UpdateWindow( handle ); MSG msg; while( (msg.message!=WM_QUIT) && (!keys[VK_ESCAPE]) ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else Render(); } } Destroy(); UnregisterClass( "Window1", wc.hInstance ); return 0; } LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: { PostQuitMessage( 0 ); return 0; } case WM_KEYDOWN: { keys[wParam] = TRUE; if (wParam==40)//// Pfeil runter { aaa->trans(D3DXVECTOR3(1.0,1.0,1.0),D3DXVECTOR3(0.0,- 0.25,0.0),0.0f,0.0f,0.00f); } if (wParam==38)//// Pfeil hoch { aaa->trans(D3DXVECTOR3(1.0,1.0,1.0),D3DXVECTOR3(0.0,+0.25,0.0),0.0f,0.0f,0.00f); } if (wParam==37)//// Pfeil links { aaa->trans(D3DXVECTOR3(1.0,1.0,1.0),D3DXVECTOR3(-0.25,0.0,0.0),0.0f,0.0f,0.00f); } if (wParam==39)//// Pfeil rechts { aaa->trans(D3DXVECTOR3(1.0,1.0,1.0),D3DXVECTOR3(0.25,0.0,0.0),0.0f,0.0f,0.00f); } return 0; } case WM_KEYUP: { keys[wParam] = FALSE; return 0; } } return DefWindowProc( hWnd, msg, wParam, lParam ); }
Hier die primitiv.CPP
# include "primitiv.h" # include <d3dx8.h> #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) dreieck::dreieck() { D3D_VertexBuffer = NULL; drKopf = NULL; pDev = NULL; D3DXMatrixIdentity(&mMeshMatrix); } dreieck::dreieck(TVertex3 Obj[3], LPDIRECT3DDEVICE8 pDevin) { D3D_VertexBuffer = NULL; D3DXMatrixIdentity(&mMeshMatrix); drKopf = (drListe *)malloc(sizeof(drKopf)); pDev = pDevin; drKopf->nxt = NULL; drKopf->Objekt[0]=Obj[0]; drKopf->Objekt[1]=Obj[1]; drKopf->Objekt[2]=Obj[2]; pDev->CreateVertexBuffer( sizeof(drKopf->Objekt), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &D3D_VertexBuffer); VOID* pVertex; D3D_VertexBuffer->Lock( 0, sizeof(drKopf->Objekt), (BYTE**)&pVertex, 0 ); memcpy( pVertex, drKopf->Objekt, sizeof(drKopf->Objekt) ); D3D_VertexBuffer->Unlock(); } void dreieck::render() { pDev->SetTransform(D3DTS_WORLD,&mMeshMatrix); pDev->SetStreamSource( 0, D3D_VertexBuffer, sizeof(TVertex3) ); pDev->SetVertexShader( D3DFVF_CUSTOMVERTEX ); pDev->DrawPrimitive ( D3DPT_TRIANGLELIST , 0, 1 ); } VOID dreieck::trans( D3DXVECTOR3 vScale, D3DXVECTOR3 vTranslate, FLOAT fRotX, FLOAT fRotY, FLOAT fRotZ) { D3DXMATRIX mScale; // Skalierungsmatrix D3DXMATRIX mTranslate; // Translationsmatrix D3DXMATRIX mRotX; // Rotationsmatrix X-Achse D3DXMATRIX mRotY; // Rotationsmatrix Y-Achse D3DXMATRIX mRotZ; // Rotationsmatrix Z-Achse D3DXMatrixScaling(&mScale, vScale.x, vScale.y, vScale.z ); D3DXMatrixTranslation(&mTranslate, vTranslate.x, vTranslate.y, vTranslate.z ); D3DXMatrixRotationX(&mRotX,fRotX); D3DXMatrixRotationY(&mRotY,fRotY); D3DXMatrixRotationZ(&mRotZ,fRotZ); D3DXMatrixMultiply(&mMeshMatrix,&mMeshMatrix,&mScale); D3DXMatrixMultiply(&mMeshMatrix,&mMeshMatrix,&mTranslate); D3DXMatrixMultiply(&mMeshMatrix,&mMeshMatrix,&mRotX); D3DXMatrixMultiply(&mMeshMatrix,&mMeshMatrix,&mRotY); D3DXMatrixMultiply(&mMeshMatrix,&mMeshMatrix,&mRotZ); }
Hier die primitiv.h:
#ifndef primitiv_n #define primitiv_n #include <d3dx8.h> struct TVertex3 { D3DXVECTOR3 vecPos; DWORD col; }; class dreieck { struct drListe { TVertex3 Objekt[3]; drListe *nxt; }; private: ; drListe *drKopf; LPDIRECT3DDEVICE8 pDev; LPDIRECT3DVERTEXBUFFER8 D3D_VertexBuffer; D3DXMATRIX mMeshMatrix; public: dreieck(); dreieck(TVertex3 Obj[3], LPDIRECT3DDEVICE8 pDevin); void add(D3DXVECTOR3 vecPos, DWORD colPun, LPDIRECT3DDEVICE8 pDevin); void render(); int set(TVertex3 Obj[3], LPDIRECT3DDEVICE8 pDevin); void trans( D3DXVECTOR3 vScale, D3DXVECTOR3 vTranslate, FLOAT fRotX, FLOAT fRotY, FLOAT fRotZ); }; #endif
-
Versuch mal, alles neu kompilieren zu lassen. Sonst weiß ich jetzt auch nix, vielleicht hilft es wenn Du Dich nach C/C++ verschieben lässt.
-
Ist new überladen? Bist du auch sicher das der Konstruktor wirklich nicht gerufen wird und der Fehler nicht doch wo anders herkommt?
-
Was meinste mit überladen ?
Aber ich bin mir ziemlich sicher wenn ich aaa und bbb tausche dann funtzt nur bbb und nicht aaa ??!
Und kompliliert habe ich das ding 100 mal und auch neustart !! Aber ich bin im Moment echt ratlos !!! Gibs denn irgendwelche Tipps wie ich es vielleicht ansich besser machen könnte ?
-
Also das Problem liest irgendwie am New Operator
Fehler unten im Kompile Fenster:
Nicht abgefangene Ausnahme in Tutorial3.exe (NTDLL.DLL): 0xC0000005: Access Violation.operator new zurückgegeben 0x00000000
??
Mmmhh kann da einer was mit anfangen ??
-
mein ratschlag:
erstell ein neues projekt und teste dort die funktion des new operators. wenn es dort auch nicht geht, dann installier dein system neu oder besorg dir einen anderen compiler.
falls es dann aber funktionieren sollte, dann programmier nach und nach alles vom alten projekt ins neue, solange bis du fertig bist oder bis der fehler wieder auftritt.
-
mein vorschlag : lerne C + + ! ! !
-
@ <gallion> TOLLER VORSCHLAG!! UND WIE LERNT MAN AM BESTEN !!!
-------------------------------LEARNING BY DOING -----------------Du BIST JA DER ÜBERHELD!!!!
Fragt man hier nach Hilfe wird man direkt Diskriminiert TOLL!!!!
-
Original erstellt von Soulfly2111:
Diskriminiertseit wann schreibt man das groß ?
neuer vorschlag : erst deutsche sprache , dann c + + ! ! !
-
kritisieren kann doch jeder - schlag mal lieber was vor! <gallion>
C++ kann ich gut ich weiss auch was überladene Operatoren sind -
Ich habe new nicht überladen! Sonst hätte man das ja in der Header datei gesehen! ODER? Ist auch egal, ich werde KXII Idee ausprobieren. Weil deine
geistigen Ergüsse <gallion> mich nicht gerade weiter bringen!Vorschlag für dich <gallion>: Sei nicht so scheiße, dann bekommste auch mal Freunde !!!
PS: grammatische Fehler und rechtschreib Fehler sind mir egal !!! Werd hier ja nicht dafür bewertet!!!
-
Ich habe wohl en Tip für dich: Don't feed the Trolls!!!!!!