2013-08-27 61 views
0

我有一個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()); 
+2

'vbPtr'沒有初始化之前vbPtr初始化爲NULL。 –

+0

爲什麼你首先瀏覽(貌似正確)'sizeof(MyVertex)* m_VertsBuff0.size()',但是切換到'sizeof(m_VertsBuff0)'呢?看起來你並不完全知道傳遞給'memcpy'的參數。如果沒有正確理解應該發生什麼,它看起來很像無頭的嘗試。這種過程永遠不會有好的結果。您應該詳細瞭解memcpy的功能,以及與vertexbuffer的關係。 –

+1

對於初學者,您應該檢查'Lock'調用的返回值,以確保它成功。 – molbdnilo

回答

0

您必須初始化vbPtr;

void* vbPtr = new char[v.size() * sizeof(MyVertex)]; 
    memcpy (vbPtr, v.data(), v.size() * sizeof(MyVertex)); 
+0

錯誤,如果調用成功,則d3d9鎖定API將使用有效值填充vbPtr變量。你可以,如果你想保留'std :: copy',寫下:'MyVertex * vbPtr = nullptr;'並將第二個參數強制轉換爲'(void **)&vbPtr'。只有在'vbPtr!= nullptr' ofcourse才能進行復制。 – galop1n

+0

我的應用程序仍然在memcpy命令上崩潰。所以似乎有其他東西是不正確的。 – Marnix

+0

@Marnix是的。螞蟻認爲某些東西可能在您發佈的代碼之外,所以如果沒有這些代碼,我們無法幫助您。看到我上面的評論 –

1

使用m_VertsBuff0.size() * sizeof(MyVertex)代替sizeof(m_VertsBuff0) ,並確保 'vbPtr' 指向正確分配內存,例如:

void* vbPtr = new char[v.size() * sizeof(int)]; 
+0

如果你看他的代碼,他試過了。 –

+0

我更新了我的問題,這也不起作用。 – Marnix

0

嗯,我想你已經調用地圖

相關問題