2013-08-27 4 views
0

У меня есть std::vector<MyVertex> где MyVertex - это структура. Я должен переместить эти данные в буфер вершин в Direct3D 9, а примеры, которые я видел, используют memcpy. К сожалению, memcpy сбой моего приложения, поэтому я определенно делаю что-то неправильно.Копировать std :: vector to void pointer

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])); 

Update:
Это работало раньше, когда я только использовал array вместо vector. Кажется, мне не пришлось сначала инициализировать void*, потому что пример работал очень хорошо. Затем я сменил его на vector, и все пошло не так. Почему я должен инициализировать void* внезапно, и это все равно сбой моего приложения.

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

'vbPtr' не инициализирована. –

+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

Неправильно, API блокировки d3d9 заполнит переменную vbPtr допустимым значением, если вызов будет успешным. Вы можете, если хотите сохранить 'std :: copy', пишите это:' MyVertex * vbPtr = nullptr; 'и добавьте второй аргумент в' (void **) & vbPtr'. Делайте копию только в том случае, если 'vbPtr! = Nullptr'. – galop1n

+0

Мое приложение все еще сбой в команде memcpy. Так что, похоже, что-то еще не так. – Marnix

+0

@Marnix да. ant, что-то, вероятно, вне кода, который вы отправили, поэтому мы не можем помочь вам без этого кода. См. Мой комментарий выше –

1

Использование m_VertsBuff0.size() * sizeof(MyVertex) вместо sizeof(m_VertsBuff0) и убедитесь, что точки '' vbPtr правильно распределенной памяти, например .:

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

Если вы посмотрите в его коде, он попробовал это. –

+0

Я обновил свой вопрос, это тоже не работает. – Marnix

0

Хм, я думаю, вы должны инициализировать vbPtr в NULL перед вызовом карты