我有一個std::vector<MyVertex>
,其中MyVertex
是一個結構體。我必須將這些數據推送到Direct3D 9中的頂點緩衝區,並且我看到的示例使用memcpy
。不幸的是,memcpy
崩潰了我的應用程序,所以我肯定做錯了什麼。將std :: vector複製到void指針
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]));
更新:
這是當我只是用一個array
代替vector
的工作之前。它似乎並不是我必須首先初始化void*
,因爲這個例子工作得很好。然後我將其更改爲vector
,並且出錯了。爲什麼我必須突然初始化void*
,並且這樣做仍然會使我的應用程序崩潰。
memcpy (vbPtr, m_VertsBuff0.data(), sizeof(MyVertex) * m_VertsBuff0.size());
'vbPtr'沒有初始化之前vbPtr初始化爲NULL。 –
爲什麼你首先瀏覽(貌似正確)'sizeof(MyVertex)* m_VertsBuff0.size()',但是切換到'sizeof(m_VertsBuff0)'呢?看起來你並不完全知道傳遞給'memcpy'的參數。如果沒有正確理解應該發生什麼,它看起來很像無頭的嘗試。這種過程永遠不會有好的結果。您應該詳細瞭解memcpy的功能,以及與vertexbuffer的關係。 –
對於初學者,您應該檢查'Lock'調用的返回值,以確保它成功。 – molbdnilo