0

std::vector<MyVertex>whereはMyVertex構造体です。このデータを Direct3D 9 の頂点バッファーにプッシュする必要があり、私が見た例ではmemcpy. 残念ながら、memcpyアプリケーションがクラッシュするので、間違いなく何か間違ったことをしています。

std::vector<MyVertex> m_VertsBuff0;

void* vbPtr;
vertexbuffer->Lock (0, 0, &vbPtr, D3DLOCK_DISCARD);
memcpy (vbPtr, &m_VertsBuff0[0], sizeof(m_VertsBuff0)); // also tried sizeof(MyVertex)*m_VertsBuff0.size()
// std::copy(m_VertsBuff0.begin(), m_VertsBuff0.end(), vbPtr); // gives a compiler error void* unknown size
vertexbuffer->Unlock ();
device->SetStreamSource (0, vertexbuffer, 0, sizeof(m_VertsBuff0[0]));

更新:の代わりに を
使用したとき、これは以前は機能していました。例は問題なく動作していたので、最初から を初期化する必要はなかったようです。それから私はそれをaに変更しましたが、うまくいきませんでした。突然初期化する必要があるのに、そうするとアプリケーションがクラッシュするのはなぜですか。arrayvectorvoid*vectorvoid*

memcpy (vbPtr, m_VertsBuff0.data(), sizeof(MyVertex) * m_VertsBuff0.size());
4

3 に答える 3

1

m_VertsBuff0.size() * sizeof(MyVertex)の代わりに使用sizeof(m_VertsBuff0) し、「vbPtr」が適切に割り当てられたメモリを指すようにします。例:

void* vbPtr = new char[v.size() * sizeof(int)];
于 2013-08-27T08:10:06.217 に答える
0

うーん、マップを呼び出す前に vbPtr を NULL に初期化する必要があると思います

于 2013-08-27T18:06:32.033 に答える
0

vbPtr を初期化する必要があります。

  void* vbPtr = new char[v.size() * sizeof(MyVertex)];
  memcpy (vbPtr, v.data(), v.size() * sizeof(MyVertex));
于 2013-08-27T08:11:57.430 に答える