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

30.11.2009, 21:45

brauche hilfe bei Uebung 2.7.6

Hallo, ich steck total bei einem Fehler bei der Aufgabe 2.7.6 über Index/VertexBuffer fest, der compiler giebt den Fehler Zugriffsverletzung beim Lesen an Position 0xbf7ff0ed. aus, ich hab schon alles versucht was mir einfällt, hoffe ihr könnt mir helfen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
tbResult Render(float fNumSecsPassed)
{

    HRESULT     hResult;
    
    tbMatrix mCamera = tbMatrixCamera(g_vCameraPosition,
                                      g_vCameraPosition+tbVector3(sinf(g_fCameraAngle),0.0f,cosf(g_fCameraAngle)),
                                      tbVector3(0.0f,1.0f,0.0f));
    g_pD3DDevice->SetTransform(D3DTS_VIEW,(D3DMATRIX*)(&mCamera));

    float fAspect = (float)(g_Direct3DParameters.VideoMode.Width)
        / (float) (g_Direct3DParameters.VideoMode.Height);

    tbMatrix mProjection = tbMatrixProjection(g_fFOV,fAspect,0.1f,250.0f);
    g_pD3DDevice->SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)(&mProjection));




    // Den Bildpuffer und den Z-Buffer leeren

    if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 63),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!

        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    if(FAILED(hResult = g_pD3DDevice->CreateVertexBuffer(8 * sizeof(SVertex),0,SVertex::dwFVF,D3DPOOL_MANAGED,
                                     &g_pVertexBuffer,NULL)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->CreateVertexBuffer()",hResult,TB_ERROR)
    }

    
    if(FAILED(hResult = g_pD3DDevice->CreateIndexBuffer( 36 * sizeof(WORD),0,D3DFMT_INDEX16,
                                    D3DPOOL_MANAGED,&g_pIndexBuffer,NULL)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->CreateIndexBuffer()",hResult,TB_ERROR)
    }
    // Szene beginnen

    SVertex* pvVertBuffer = NULL;
    WORD* pwIndBuffer = NULL;
    g_pD3DDevice->BeginScene();
    for(int iCube = 0;iCube < g_iNumCubes;iCube++)
    {
        tbMatrix mTranslation = tbMatrixTranslation(g_SWUERFELLIST[iCube].vPosition);

        g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mTranslation)); 

        g_pVertexBuffer->Lock(iCube*8*sizeof(SVertex),8*sizeof(SVertex),(void**)(&pvVertBuffer),D3DLOCK_NOSYSLOCK);
        g_pIndexBuffer->Lock(iCube * 36 * sizeof(WORD),36*sizeof(WORD),(void**)(&pwIndBuffer),D3DLOCK_NOSYSLOCK);
        
        for(int i=0;i<8;i++)
        {
            pvVertBuffer[i].vPosition = g_SWUERFELLIST[iCube].avVertices[i].vPosition;
            pvVertBuffer[i].dwColor = g_SWUERFELLIST[iCube].avVertices[i].dwColor;
            pvVertBuffer[i].vTexture = g_SWUERFELLIST[iCube].avVertices[i].vTexture;

        }
        g_pVertexBuffer->Unlock();
        
        for(int i=0;i<36;i++)
        {
            pwIndBuffer[i] = g_awIndices[i];
        }
        
        
        
        if(FAILED(hResult = g_pIndexBuffer->Unlock()))
        {
            TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitive", hResult, TB_STOP);
        }
        g_pD3DDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(SVertex));
        g_pD3DDevice->SetIndices(g_pIndexBuffer);
        
        
        if(FAILED(hResult = g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
                                       0,
                                       0,
                                       8,
                                       0,
                                       12)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitive", hResult, TB_STOP);
    }

        




    }
    

    

    
    




    // Szene beenden

    g_pD3DDevice->EndScene();

    // Der große Moment: den Bildpuffer sichtbar machen

    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
    return TB_OK;
}

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

30.11.2009, 21:57

Ich würde mal raten, dass die Lock Aufrufe nicht funktionieren. Somit greifst du nachher auf ungültigen Speicher zu und da hast du dann den Fehler.

Aber um mehr sagen zu können solltest du noch mal mit dem Debugger schauen, wo der Fehler exakt auftritt. Also bei welchem Aufruf.

3

30.11.2009, 22:22

Hier kommt der Fehler:
if(FAILED(hResult = g_pIndexBuffer->Unlock()))
und der compiler zeigt bei g_pIndexBuffer.Name und Creation CallStack jeweils Ausdruck konnte nicht ausgewertet werden und <bad ptr>

4

30.11.2009, 22:57

tata hab den Fehler, ich durfte kein offset bei den Indices und den Vertices machen bei lock, danke für den Hinweis

5

01.12.2009, 14:06

Aba mal was anderes. Du tust den Vertex-Und indexbuffer in der Render-Funktion erzeugen ?
Das ist ja die Performance-Verschwendung des Jahrhunderts. In jedem Frame einen neuen Vertexbuffer ???

Machs doch in die Init-Funktion, und in Render sperrst du den VertexBuffer bzw. Index-Buffer nur noch. (entsperren natürlich nicht vergessen ;))

6

01.12.2009, 18:15

Jaja ich weis, war nur rumprobieren wieso es nicht geklappt hat, haab ihn natürlich in der intiu Funktion erzeugt dann letztendlich

Werbeanzeige