Konstruktor nur 1-mal ??



  • Wenn man eine Klasse erstellt

    z.B.

    dreieck *dre;
    dreieck *dre2

    dre = 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:
    Diskriminiert

    seit 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!!!!!!


Anmelden zum Antworten