2010-04-25 10 views
1

ayant des problèmes avec la ligne suivanteviolation d'accès emplacement de lecture 0x00184000

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

il semble que la méthode CreateBuffer a des problèmes de lecture & MVB. mVB est défini dans box.h et ressemble à ceci

ID3D10Buffer* mVB; 

Ci-dessous se trouve le code dans sa totalité. ceci est tous les fichiers qui MVB se trouve.

//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] arguements étant transmis pour m et n est dx

m = 129, n = 129 , dx = 1.0f (ils sont tous flottants)

m et n représentent les rangées et les colonnes en perspective. dx est la largeur et la hauteur.

Merci encore pour l'aide

+0

Quels arguments donnez-vous à 'init()'? – phimuemue

+0

Btw: Je suppose que votre 'case' est censé être un cube, alors pourquoi a-t-il des sommets' n * m'? Ne devrait-il pas avoir seulement 8 (et donc, 12 visages)? – phimuemue

+0

n et m sont, je crois, les nombres de sommets dans les directions x et z. les multiplier vous donne le montant total. Je pense. ceci est le code que je m'apprends d'un livre par Frank Luna sur directx 10. J'ai mis à jour l'information – numerical25

Répondre

1

Si vous voulez un pointeur sur le tableau de données d'un vecteur, vous devez utiliser &vec[0]. Si vous utilisez &vec, il vous donnera un pointeur vers l'objet vectoriel, qui peut contenir toutes les structures de gestion/... qui n'ont rien à voir avec les données que vous avez insérées dans le vecteur.

Les données elles-mêmes sont stockées en mémoire continue à partir de &vec[0], utilisez-les lors de l'initialisation de vos structures D3D.

+0

Je pensais aussi, mais pensez-vous, que cela va vraiment causer un violation d'accès? Je pense que cela pourrait "juste" donner de mauvaises valeurs au GPU. – phimuemue

+0

@phimuemue: Pas certain, mais typiquement l'objet vectoriel lui-même sera plutôt petit, car tous les éléments insérés seront stockés dans un endroit alloué dynamiquement alors que le vecteur lui-même ne contient qu'un pointeur vers cela. Ainsi, la lecture de beaucoup de données '& vec' aura probablement dépassé la fin de l'objet vectoriel et pourrait (ou non) atteindre certaines adresses qui ne sont en fait pas allouées du tout et entraîner une violation d'accès. – sth

+0

J'ai un autre problème, mais cela a résolu le premier problème. Je vais probablement poster un autre si je ne peux pas le comprendre. Mais j'ai remarqué que le livre a enlevé le [0] et le code les a eu. – numerical25

Questions connexes