DirectX / C ++如何取消引用向量数据数组以初始化D3D11 SUBRESOURCE数据

时间:2013-01-22 00:46:48

标签: c++ c++11 directx directx-11

我正在尝试将指向Vertex Data数组(基类成员)的指针传递给用于初始化Direct3D顶点缓冲区的方法(ID3D11Buffer)。

我想使用变量" v4",指向数组的指针,但我想我没有正确地解引用指针。有人能指出我正确的方向吗?

我已经尝试了很多方法来完成这项任务,但我只能得到一个基本的数组工作,(有时我最终会转换为" const void *"错误)。

我如何使用指针?

我遇到的问题是...... vertexSubResourceData.pSysMem = v1;

(p.s。使用V.S. C ++ 2012年11月CTP编译器..尚未发布..)

* 已回答:已确认它是Visual Studio 2012 C ++ Nov. CTP编译器错误。使用C ++ 11初始化语法声明的Vector结构的数组,甚至在类之外,都被错误地解释,(当然,除非我使用了不正确的数组初始化语法)。另请注意:这仅适用于与指针关联的初始化列表。 *

谢谢!

//简化代码

void Triangle::InitializeVertexBuffer()
{
    struct V
    {
        float X, Y, Z;    // vertex position
    };

    // Compiles But doesn't work as desired.
    // changed from V* v4 = new V[] // Compiled without range.
    // Pointer to this data would ideally come from base static pointer, or file.
    V* v4 = new V[3]     
    {
        { 0.50f, 0.5f, 0.0f },
        { 0.50f, -0.5f, 0.0f },
        { -0.50f, -0.5f, 0.0f },
    };

    // Compiles and Works to prove compiler issue with initialization lists. 
    V* vectorList = new V[3];
    vectorList[0].X = 0.5f;
    vectorList[0].Y = 0.5f;
    vectorList[0].Z = 0.00f;

    vectorList[1].X = 0.5f;
    vectorList[1].Y = -0.5f;
    vectorList[1].Z = 0.00f;

    vectorList[2].X = -0.5f;
    vectorList[2].Y = -0.5f;
    vectorList[2].Z = 0.00f;


    unsigned int size = sizeof(V) * 3; //sizeof(* Model::Vertices);

    // The Description of the Vertex Buffer
    D3D11_BUFFER_DESC vertexBufferDescription = {0};
    vertexBufferDescription.ByteWidth = size;
    vertexBufferDescription.BindFlags = D3D11_BIND_VERTEX_BUFFER; 

    // Model Data to be transferred to GPU Buffer.

    D3D11_SUBRESOURCE_DATA vertexSubResourceData = {0};
    vertexSubResourceData.SysMemPitch = 0;
    vertexSubResourceData.SysMemSlicePitch = 0;

    // Can't figure out how to dereference v4

    vertexSubResourceData.pSysMem = vectorList; // works, but using "v4" doesn't.

    // vertexSubResourceData.pSysMem = Model::Vertices; 
    // This is what I /really/ want .. Pointer to vertice array data from base class


    NS::DeviceManager::Device->CreateBuffer(
        &vertexBufferDescription, 
        &vertexSubResourceData, 
        &NS::ModelRenderer::VertexBuffer);
}

1 个答案:

答案 0 :(得分:1)

当你写V* v4 = new V[]{...};时,它是非法的C ++。 CTP编译器正在接受格式错误的代码。试试V* v4 = new V[3]{...};

检查C ++标准,来自5.3.4p1:

  

[expression] attribute-specifier-seqopt

因此,[]中的表达式似乎是必需。我相信new V[]是编译器的扩展(仍在检查中)。

正如ildjarn指出的那样,你希望vertexSubResourceData.pSysMem = v4;&4,你会给你指针的地址,而不是数组。

<强>更新

我认为这是编译器中的一个错误。尝试使用旧的C ++ 03语法:V* v4 = new V[3]; v4[0] = ...;如果可行,那肯定是一个错误。