2010-05-02 73 views
2

我得到确切的错误是访问冲突写入位置,在我的循环

First-chance exception at 0x0096234a in chp2.exe: 0xC0000005: Access violation writing location 0x002b0000. 
Windows has triggered a breakpoint in chp2.exe. 

这里

for(DWORD i = 0; i < m; ++i) 
{ 
    //we are start at the top of z 
    float z = halfDepth - i*dx; 
    for(DWORD j = 0; j < n; ++j) 
    { 
     //to the left of us 
     float x = -halfWidth + j*dx; 
     float y = 0.0f; 
     vertices[i*n+j].pos = D3DXVECTOR3(x, y, z); //<----- Right here 
     vertices[i*n+j].color = D3DXVECTOR4(1.0f, 0.0f, 0.0f, 0.0f); 
    } 
} 

断点处停止,我不知道我做错了。下面是整个代码

#include "MyGame.h" 
//#include "CubeVector.h" 
/* This code sets a projection and shows a turning cube. What has been added is the project, rotation and 
a rasterizer to change the rasterization of the cube. The issue that was going on was something with the effect file 
which was causing the vertices not to be rendered correctly.*/ 
typedef struct 
{ 
    ID3D10Effect* pEffect; 
    ID3D10EffectTechnique* pTechnique; 

    //vertex information 
    ID3D10Buffer* pVertexBuffer; 
    ID3D10Buffer* pIndicesBuffer; 
    ID3D10InputLayout* pVertexLayout; 

    UINT numVertices; 
    UINT numIndices; 
}ModelObject; 

ModelObject modelObject; 
// World Matrix 
D3DXMATRIX     WorldMatrix; 
// View Matrix 
D3DXMATRIX     ViewMatrix; 
// Projection Matrix 
D3DXMATRIX     ProjectionMatrix; 
ID3D10EffectMatrixVariable* pProjectionMatrixVariable = NULL; 

//grid information 
#define NUM_COLS 16 
#define NUM_ROWS 16 

#define CELL_WIDTH 32 
#define CELL_HEIGHT 32 

#define NUM_VERTSX (NUM_COLS + 1) 
#define NUM_VERTSY (NUM_ROWS + 1) 




bool MyGame::InitDirect3D() 
{ 
    if(!DX3dApp::InitDirect3D()) 
    { 
     return false; 
    } 

    D3D10_RASTERIZER_DESC rastDesc; 
    rastDesc.FillMode = D3D10_FILL_WIREFRAME; 
    rastDesc.CullMode = D3D10_CULL_FRONT; 
    rastDesc.FrontCounterClockwise = true; 
    rastDesc.DepthBias = false; 
    rastDesc.DepthBiasClamp = 0; 
    rastDesc.SlopeScaledDepthBias = 0; 
    rastDesc.DepthClipEnable = false; 
    rastDesc.ScissorEnable = false; 
    rastDesc.MultisampleEnable = false; 
    rastDesc.AntialiasedLineEnable = false; 

    ID3D10RasterizerState *g_pRasterizerState; 
    mpD3DDevice->CreateRasterizerState(&rastDesc, &g_pRasterizerState); 
    mpD3DDevice->RSSetState(g_pRasterizerState); 

    // Set up the World Matrix 
    //The first line of code creates your identity matrix. Second line of code 
    //second combines your camera position, target location, and which way is up respectively 
    D3DXMatrixIdentity(&WorldMatrix); 
    D3DXMatrixLookAtLH(&ViewMatrix, new D3DXVECTOR3(200.0f, 60.0f, -20.0f), new D3DXVECTOR3(200.0f, 50.0f, 0.0f), new D3DXVECTOR3(0.0f, 1.0f, 0.0f)); 
    // Set up the projection matrix 
    D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, (float)D3DX_PI * 0.5f, (float)mWidth/(float)mHeight, 0.1f, 100.0f); 

    if(!CreateObject()) 
    { 
     return false; 
    } 

    return true; 
} 

//These are actions that take place after the clearing of the buffer and before the present 
void MyGame::GameDraw() 
{ 

    static float rotationAngle = 0.0f; 

    // create the rotation matrix using the rotation angle 
    D3DXMatrixRotationY(&WorldMatrix, rotationAngle); 
    rotationAngle += (float)D3DX_PI * 0.0f; 

    // Set the input layout 
    mpD3DDevice->IASetInputLayout(modelObject.pVertexLayout); 

    // Set vertex buffer 
    UINT stride = sizeof(VertexPos); 
    UINT offset = 0; 
    mpD3DDevice->IASetVertexBuffers(0, 1, &modelObject.pVertexBuffer, &stride, &offset); 
    mpD3DDevice->IASetIndexBuffer(modelObject.pIndicesBuffer, DXGI_FORMAT_R32_UINT, 0); 

    // Set primitive topology 
    mpD3DDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 

    // Combine and send the final matrix to the shader 
    D3DXMATRIX finalMatrix = (WorldMatrix * ViewMatrix * ProjectionMatrix); 
    pProjectionMatrixVariable->SetMatrix((float*)&finalMatrix); 


    // make sure modelObject is valid 


    // Render a model object 
    D3D10_TECHNIQUE_DESC techniqueDescription; 
    modelObject.pTechnique->GetDesc(&techniqueDescription); 

    // Loop through the technique passes 
    for(UINT p=0; p < techniqueDescription.Passes; ++p) 
    { 
     modelObject.pTechnique->GetPassByIndex(p)->Apply(0); 
     // draw the cube using all 36 vertices and 12 triangles 
     mpD3DDevice->DrawIndexed(modelObject.numIndices,0,0); 
    } 
} 

//Render actually incapsulates Gamedraw, so you can call data before you actually clear the buffer or after you 
//present data 
void MyGame::Render() 
{ 
    DX3dApp::Render(); 
} 

bool MyGame::CreateObject() 
{ 
    //dx will represent the width and the height of the spacing of each vector 
    float dx = 1; 
    //Below are the number of vertices 
    //m is the vertices of each row. n is the columns 
    DWORD m = 30; 
    DWORD n = 30; 
    //This get the width of the entire land 
    //30 - 1 = 29 rows * 1 = 29 * 0.5 = 14.5 
    float halfWidth = (n-1)*dx*0.5f; 
    float halfDepth = (m-1)*dx*0.5f; 
    float vertexsize = m * n; 
    VertexPos vertices[80]; 

    for(DWORD i = 0; i < m; ++i) 
    { 
     //we are start at the top of z 
     float z = halfDepth - i*dx; 
     for(DWORD j = 0; j < n; ++j) 
     { 
      //to the left of us 
      float x = -halfWidth + j*dx; 
      float y = 0.0f; 
      vertices[i*n+j].pos = D3DXVECTOR3(x, y, z); 
      vertices[i*n+j].color = D3DXVECTOR4(1.0f, 0.0f, 0.0f, 0.0f); 
     } 
    } 

    int k = 0; 

    DWORD indices[540]; 
    for(DWORD i = 0; i < n-1; ++i) 
    { 
     for(DWORD j = 0; j < n-1; ++j) 
     { 
      indices[k]  = (i * n) + j; 
      indices[k + 1] = (i * n) + j + 1; 
      indices[k + 2] = (i + 1) * n + j; 

      indices[k + 3] = (i + 1) * n + j; 
      indices[k + 4] = (i * n) + j + 1; 
      indices[k + 5] = (i + 1) * n + j+ 1; 

      k += 6; 
     } 
    } 




    //Create Layout 
    D3D10_INPUT_ELEMENT_DESC layout[] = { 
     {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT, 0 , 0, D3D10_INPUT_PER_VERTEX_DATA, 0}, 
     {"COLOR",0,DXGI_FORMAT_R32G32B32A32_FLOAT, 0 , 12, D3D10_INPUT_PER_VERTEX_DATA, 0} 
    }; 

    UINT numElements = (sizeof(layout)/sizeof(layout[0])); 
    modelObject.numVertices = sizeof(vertices)/sizeof(VertexPos); 

    //Create buffer desc 
    D3D10_BUFFER_DESC bufferDesc; 
    bufferDesc.Usage = D3D10_USAGE_DEFAULT; 
    bufferDesc.ByteWidth = sizeof(VertexPos) * modelObject.numVertices; 
    bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; 
    bufferDesc.CPUAccessFlags = 0; 
    bufferDesc.MiscFlags = 0; 

    D3D10_SUBRESOURCE_DATA initData; 
    initData.pSysMem = vertices; 
    //Create the buffer 

    HRESULT hr = mpD3DDevice->CreateBuffer(&bufferDesc, &initData, &modelObject.pVertexBuffer); 
    if(FAILED(hr)) 
     return false; 

    modelObject.numIndices = sizeof(indices)/sizeof(DWORD); 

    bufferDesc.ByteWidth = sizeof(DWORD) * modelObject.numIndices; 
    bufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER; 

    initData.pSysMem = indices; 

    hr = mpD3DDevice->CreateBuffer(&bufferDesc, &initData, &modelObject.pIndicesBuffer); 
    if(FAILED(hr)) 
     return false; 


    ///////////////////////////////////////////////////////////////////////////// 
    //Set up fx files 
    LPCWSTR effectFilename = L"effect.fx"; 
    modelObject.pEffect = NULL; 

    hr = D3DX10CreateEffectFromFile(effectFilename, 
     NULL, 
     NULL, 
     "fx_4_0", 
     D3D10_SHADER_ENABLE_STRICTNESS, 
     0, 
     mpD3DDevice, 
     NULL, 
     NULL, 
     &modelObject.pEffect, 
     NULL, 
     NULL); 

    if(FAILED(hr)) 
     return false; 

    pProjectionMatrixVariable = modelObject.pEffect->GetVariableByName("Projection")->AsMatrix(); 
    //Dont sweat the technique. Get it! 
    LPCSTR effectTechniqueName = "Render"; 

    modelObject.pTechnique = modelObject.pEffect->GetTechniqueByName(effectTechniqueName); 
    if(modelObject.pTechnique == NULL) 
     return false; 


    //Create Vertex layout 
    D3D10_PASS_DESC passDesc; 
    modelObject.pTechnique->GetPassByIndex(0)->GetDesc(&passDesc); 

    hr = mpD3DDevice->CreateInputLayout(layout, numElements, 
     passDesc.pIAInputSignature, 
     passDesc.IAInputSignatureSize, 
     &modelObject.pVertexLayout); 
    if(FAILED(hr)) 
     return false; 

    return true; 
} 

回答

3

如果你有每行30个顶点和30中的每一列怎么来的顶点被定义为

VertexPos vertices[80]; 

这条线:

vertices[i*n+j].pos = D3DXVECTOR3(x, y, z); 

写过去的顶点数组的末尾每当我* n + j> 79(例如,如果i = 10,那么i * n + j> = 300)

+0

谢谢。出于某种原因,我认为如果我得到了一个顶点已损坏的错误消息,那么情况就是如此。但我猜想一个超出其范围的数组可能有多个错误消息 – numerical25 2010-05-03 00:58:51

2

最有可能的是,你正在写过顶点数组的末尾或试图从无效变量(空)读取。确保你的阵列尺寸合适。

2

您的顶点数组的大小为80.在最坏的情况下,您尝试写入顶点[i * n + j],其中i = 30,n = 30,j = 30,所以你ar e试图解决顶点[930]。

没有打算,是吗?

+1

不是最坏的情况i = 29,n = 30,j = 29?导致访问顶点[899]? – user200783 2010-05-02 22:22:29

+0

是的,你说得对。我的错... – Luzik 2010-05-02 22:48:49