C++ 那里';这是我的向量声明/循环/但我';我不知道是什么
我最初只是在游戏中为小行星(立方体)使用一组缓冲区的单个声明。效果很好 我想创建一个缓冲向量,以便显示多个小行星。当我将缓冲区的声明更改为向量时,所有的麻烦都爆发了 编译器没有抱怨,但在运行时我得到:C++ 那里';这是我的向量声明/循环/但我';我不知道是什么,c++,vector,windows-phone-8,reference,direct3d,C++,Vector,Windows Phone 8,Reference,Direct3d,我最初只是在游戏中为小行星(立方体)使用一组缓冲区的单个声明。效果很好 我想创建一个缓冲向量,以便显示多个小行星。当我将缓冲区的声明更改为向量时,所有的麻烦都爆发了 编译器没有抱怨,但在运行时我得到: Unhandled exception at 0x71879C01 (Msvcr110d.dll) in Game.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.
Unhandled exception at 0x71879C01 (Msvcr110d.dll) in Game.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.
输出日志:
First-chance exception at 0x770D277C in Game.exe: Microsoft C++ exception: std::out_of_range at memory location 0x014A90CC.
The thread 0x8f4 has exited with code 0 (0x0).
First-chance exception at 0x770D277C in Game.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
First-chance exception at 0x770D277C in Game.exe: Microsoft C++ exception: std::out_of_range at memory location 0x014A9E10.
Unhandled exception at 0x712D9C01 (Msvcr110d.dll) in Game.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.
我已经这样声明了我的缓冲区:
// Asteroid Buffers
vector<Microsoft::WRL::ComPtr<ID3D11Buffer>> asteroidVertexBuffers;
vector<Microsoft::WRL::ComPtr<ID3D11Buffer>> asteroidIndexBuffers;
vector<uint32> asteroidIndexCounts;
我迭代并将缓冲区推入顶点:
int asteroidCount = 3;
asteroidVertexBuffers.reserve( asteroidCount );
asteroidIndexBuffers.reserve( asteroidCount );
asteroidIndexCounts.reserve( asteroidCount );
for( int a = 0; a < asteroidCount; a++ )
{
D3D11_SUBRESOURCE_DATA asteroidVertexBufferData = {0};
asteroidVertexBufferData.pSysMem = asteroidVertices;
asteroidVertexBufferData.SysMemPitch = 0;
asteroidVertexBufferData.SysMemSlicePitch = 0;
CD3D11_BUFFER_DESC asteroidVertexBufferDesc(sizeof(asteroidVertices), D3D11_BIND_VERTEX_BUFFER);
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&asteroidVertexBufferDesc,
&asteroidVertexBufferData,
&asteroidVertexBuffers.at( a )
)
);
// Runtime Crash here
asteroidIndexCounts.at( a ) = ARRAYSIZE(asteroidIndices);
D3D11_SUBRESOURCE_DATA asteroidIndexBufferData = {0};
asteroidIndexBufferData.pSysMem = asteroidIndices;
asteroidIndexBufferData.SysMemPitch = 0;
asteroidIndexBufferData.SysMemSlicePitch = 0;
CD3D11_BUFFER_DESC asteroidIndexBufferDesc(sizeof(asteroidIndices), D3D11_BIND_INDEX_BUFFER);
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&asteroidIndexBufferDesc,
&asteroidIndexBufferData,
&asteroidIndexBuffers.at( a )
)
);
}
for(int a=0;aCreateBuffer(
&小行星顶点,
&VertexBufferData,
&顶点缓冲区。位于(a)
)
);
//运行时崩溃在这里
asteroidIndexCounts.at(a)=阵列化(小行星指数);
D3D11_子资源_数据索引BufferData={0};
asteroidIndexBufferData.psysem=小行星指数;
asteroidIndexBufferData.SysMemPitch=0;
asteroidIndexBufferData.SysMemSlicePitch=0;
CD3D11_BUFFER_DESC asteroidIndexBufferDesc(小行星索引大小),D3D11_BIND_INDEX_BUFFER);
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&小行星索引Bufferdesc,
&小行星索引缓冲数据,
&小行星索引缓冲区(a)
)
);
}
可能有用的注释
std::vector<class Microsoft::WRL::ComPtr<struct ID3D11Buffer>,class std::allocator<class Microsoft::WRL::ComPtr<struct ID3D11Buffer> > >::operator []
-
这是一个Direct3D C++ + /LIE的Windows Phone 8应用程序
- Renderer.cpp可在此处完整查看:(ln:143+)
- Renderer.h可以在此处完整查看:(ln:63+)
更新:我想我发现了问题(&到重新分配的内存)
std::vector<class Microsoft::WRL::ComPtr<struct ID3D11Buffer>,class std::allocator<class Microsoft::WRL::ComPtr<struct ID3D11Buffer> > >::operator []
我想我找到了问题所在。我刚刚注意到,第一个和第二个参数中的_是内存的引用,这意味着它也需要是内存的向量。。。我会纠正,看看它是否有效
更新::我错了或者我做错了…
我为新类型添加了一些向量,然后将其全部插入到我的代码中:
int asteroidCount = 3;
asteroidVertexBuffersData.reserve( asteroidCount );
asteroidVertexBuffersDesc.reserve( asteroidCount );
asteroidVertexBuffers.reserve( asteroidCount );
asteroidIndexBuffers.reserve( asteroidCount );
asteroidIndexCounts.reserve( asteroidCount );
for( int a = 0; a < asteroidCount; a++ )
{
D3D11_SUBRESOURCE_DATA asteroidVertexBufferData = {0};
asteroidVertexBuffersData.push_back( asteroidVertexBufferData );
asteroidVertexBuffersData.at(a).pSysMem = asteroidVertices;
asteroidVertexBuffersData.at(a).SysMemPitch = 0;
asteroidVertexBuffersData.at(a).SysMemSlicePitch = 0;
CD3D11_BUFFER_DESC asteroidVertexBufferDesc(sizeof(asteroidVertices), D3D11_BIND_VERTEX_BUFFER);
asteroidVertexBuffersDesc.push_back( asteroidVertexBufferDesc );
DX::ThrowIfFailed(
m_d3dDevice->CreateBuffer(
&asteroidVertexBuffersDesc.at(a),
&asteroidVertexBuffersData.at(a),
&asteroidVertexBuffers.at(a)
)
);
int-count=3;
小行星顶点缓冲数据保留区(小行星计数);
小行星顶点缓冲区(小行星计数);
小行星顶点缓冲区保留区(小行星计数);
小行星指数缓冲区(小行星计数);
小行星数量储量(小行星数量);
对于(int a=0;aCreateBuffer(
&(a)处的顶点缓冲区,
&(a)处的数据,
&顶点缓冲区。位于(a)
)
);
它抛出了同样的错误:'(
更新::我仔细检查了故障过程,发现了以下有趣的地方
pszFunction包含:
std::vector<class Microsoft::WRL::ComPtr<struct ID3D11Buffer>,class std::allocator<class Microsoft::WRL::ComPtr<struct ID3D11Buffer> > >::operator []
std::vector::operator[]
在不知道您使用的是哪个Direct3D版本或如何创建设备的情况下,很难知道您出了什么问题。其他参数之一可能不正确并导致错误 由于第3个参数需要一个
ID3D11Buffer**
,它是指向指针的指针,因此您不需要对所需地址的向量中的项目进行引用
下面是一个小例子,它很有效。如果你的用法不同,请编辑问题,包括一个像这样的小例子,这样我们可以看到足够的内容,给你一个好的答案
#include <Windows.h>
#include <d3d11.h>
#include <DirectXMath.h>
#include <iostream>
#include <vector>
using DirectX::XMFLOAT3;
#pragma comment(lib, "d3d11.lib")
int main()
{
ID3D11Device* device = NULL;
if(FAILED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &device, NULL, NULL)))
{
std::cerr << "Device creation Failed!\n";
return 0;
}
struct SimpleVertexCombined
{
XMFLOAT3 Pos;
XMFLOAT3 Col;
};
SimpleVertexCombined verticesCombo[] =
{
XMFLOAT3(0.0f, 0.5f, 0.5f),
XMFLOAT3(0.0f, 0.0f, 0.5f),
XMFLOAT3(0.5f, -0.5f, 0.5f),
XMFLOAT3(0.5f, 0.0f, 0.0f),
XMFLOAT3(-0.5f, -0.5f, 0.5f),
XMFLOAT3(0.0f, 0.5f, 0.0f),
};
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof(SimpleVertexCombined)* 3;
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = verticesCombo;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
std::vector<ID3D11Buffer*> VertexBuffers(1);
HRESULT hr = device->CreateBuffer(&bufferDesc, &InitData, &VertexBuffers[0]);
if(SUCCEEDED(hr))
{
std::cout << "CreateBuffer Success! - Buffer = 0x" << VertexBuffers[0] << "\n";
}
else
{
std::cout << "CreateBuffer Failure!\n";
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
使用DirectX::XMFLOAT3;
#pragma注释(lib,“d3d11.lib”)
int main()
{
ID3D11Device*device=NULL;
if(失败(D3D11CreateDevice(NULL,D3D_驱动程序类型_硬件,NULL,0,NULL,0,D3D11_SDK_版本,&设备,NULL,NULL)))
{
std::cerr CreateBuffer(&bufferDesc,&InitData,&VertexBuffers[0]);
如果(成功(hr))
{
std::coutvector::at()返回值的类型是引用本身,所以我认为您应该使用“AsteroVertexBuffers.at(a)”作为方法“CreateBuffer”的第三个参数
请参阅:调整大小而不是保留:
int asteroidCount = 3;
asteroidVertexBuffers.resize( asteroidCount );
asteroidIndexBuffers.resize( asteroidCount );
asteroidIndexCounts.resize( asteroidCount );
你能说明你是如何声明每个参数的吗?你确定这个异常是由于第三个参数引起的吗?看看CreateBuffer的用法,我认为上面的任何一个代码片段都可以。你的向量是指向顶点缓冲区的指针(参见)我到家后会提供更多信息,谢谢你的帮助。我认为在这种情况下向量的定义是正确的。我编辑了我的OP,看看是否有人能找出问题所在。有什么想法吗,伙计?我已经筋疲力尽了,无法工作^ ^尝试使用resize而不是reserve forAsteroperVertexBuffers
。我从来没有看到你推过我把任何东西塞进里面,让它空着。哈,我先到了那里。不过谢谢你的帮助!:)当时很绝望,只是想,等一下,我会调试它的大小