Место чтения нарушения доступа 0x00184000 - PullRequest
1 голос
/ 25 апреля 2010

возникли проблемы со следующей строкой

HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB));

похоже, что у метода CreateBuffer проблемы с чтением & mVB. mVB определен в box.h и выглядит следующим образом

ID3D10Buffer* mVB;

Ниже приведен код целиком. это все файлы, в которых находится mVB.

//Box.cpp
#include "Box.h"
#include "Vertex.h"
#include <vector>

Box::Box()
: mNumVertices(0), mNumFaces(0), md3dDevice(0), mVB(0), mIB(0)
{   
}

Box::~Box()
{
    ReleaseCOM(mVB);
    ReleaseCOM(mIB);
}

float Box::getHeight(float x, float z)const
{
    return 0.3f*(z*sinf(0.1f*x) + x*cosf(0.1f*z));
}

void Box::init(ID3D10Device* device, float m, float n, float dx)
{
    md3dDevice = device;
    mNumVertices = m*n;
    mNumFaces = 12;

    float halfWidth = (n-1)*dx*0.5f;
    float halfDepth = (m-1)*dx*0.5f;
    std::vector<Vertex> vertices(mNumVertices);

    for(DWORD i = 0; i < m; ++i)
    {
        float z = halfDepth - (i * dx);
        for(DWORD j = 0; j < n; ++j)
        {
            float x = -halfWidth + (j* dx);

            float y = getHeight(x,z);

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

            if(y < -10.0f)
                vertices[i*n+j].color = BEACH_SAND;
            else if( y < 5.0f)
                vertices[i*n+j].color = LIGHT_YELLOW_GREEN;
            else if (y < 12.0f)
                vertices[i*n+j].color = DARK_YELLOW_GREEN;
            else if (y < 20.0f)
                vertices[i*n+j].color = DARKBROWN;
            else
                vertices[i*n+j].color = WHITE;
        }
    }

    D3D10_BUFFER_DESC vbd;
    vbd.Usage = D3D10_USAGE_IMMUTABLE;
    vbd.ByteWidth = sizeof(Vertex) * mNumVertices;
    vbd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    D3D10_SUBRESOURCE_DATA vinitData;
    vinitData.pSysMem = &vertices;
    HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB));

    //create the index buffer 

    std::vector<DWORD> indices(mNumFaces*3); // 3 indices per face

    int k = 0;

    for(DWORD i = 0; i < m-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;
        }
    }

    D3D10_BUFFER_DESC ibd;
    ibd.Usage = D3D10_USAGE_IMMUTABLE;
    ibd.ByteWidth = sizeof(DWORD) * mNumFaces*3;
    ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
    ibd.CPUAccessFlags = 0;
    ibd.MiscFlags = 0;
    D3D10_SUBRESOURCE_DATA iinitData;
    iinitData.pSysMem = &indices;
    HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mIB));
}

void Box::Draw()
{
    UINT stride = sizeof(Vertex);
    UINT offset = 0;
    md3dDevice->IASetVertexBuffers(0, 1, &mVB, &stride, &offset);
    md3dDevice->IASetIndexBuffer(mIB, DXGI_FORMAT_R32_UINT, 0);
    md3dDevice->DrawIndexed(mNumFaces*3, 0 , 0);

}


//Box.h

#ifndef _BOX_H
#define _BOX_H
#include "d3dUtil.h"

Box.h

class Box {
public:

    Box();
    ~Box();

    void  init(ID3D10Device* device, float m, float n, float dx);
    void  Draw();
    float getHeight(float x, float z)const;

private:
    DWORD mNumVertices;
    DWORD mNumFaces;

    ID3D10Device* md3dDevice;
    ID3D10Buffer* mVB;
    ID3D10Buffer* mIB;
};

#endif

[EDIT] Аргументы передаются для m и n dx

m = 129, n = 129, dx = 1.0f (все они поплавки)

m и n обозначают строки и столбцы в перспективе. дх это ширина и высота.

Еще раз спасибо за помощь

1 Ответ

1 голос
/ 25 апреля 2010

Если вы хотите указатель на массив данных вектора, вы должны использовать &vec[0]. Если вы используете &vec, это даст вам указатель на векторный объект, который может содержать все виды управляющих структур / ..., которые не имеют ничего общего с данными, вставленными в вектор.

Данные хранятся в постоянной памяти, начиная с &vec[0], поэтому используйте их при инициализации структур D3D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...