Search code examples
c++cvisual-c++directxdirectx-10

can not count array elements after passing as argument


I am having issues counting the array elements after passing it into an arguement

void GXDX::LoadMesh(GXVector vertices[], UINT indices[] = NULL)
{
    D3D10_BUFFER_DESC bufferDesc;

    UINT numVerts = sizeof(vertices)/sizeof(GXVector);

    bufferDesc.Usage = D3D10_USAGE_DEFAULT;
    bufferDesc.ByteWidth = sizeof(GXVector) * numVerts;
    bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
    bufferDesc.MiscFlags = 0;
    bufferDesc.CPUAccessFlags = 0;

       code..............

}

In the following line above

UINT numVerts = sizeof(vertices)/sizeof(GXVector);

I am trying to count the number of elements in the array varible vertices. But I am not getting an accurate count, if not one at all.

When I did a step through, I notice that I am not able to see all the values in the array, only the first value of the array.

So I am not sure if I am passing the array correctly as an arguement. In another application, I did the same thing and i was able to see all the values in the step through. I pass the array like this.

GXVector vertices[] = {     {D3DXVECTOR3(0.5f, 0.5f, 0.5f)},
                                {D3DXVECTOR3(0.5f, -0.5f, 0.5f)},
                                {D3DXVECTOR3(-0.5f, -0.5f, 0.5f)},

                                {D3DXVECTOR3(-0.5f, -0.5f, 0.5f)},
                                {D3DXVECTOR3(-0.5f, 0.5f, 0.5f)},
                                {D3DXVECTOR3(0.5f, 0.5f, 0.5f)},
    };

    UINT indices[] = {0,1,2,3,4};

    GXRenderManager::Device()->LoadMesh(vertices, indices);

So in a nutshell, Am I passing the array right as an arguement, what am I doing wrong where I can not get the correct element count of the array.


Solution

  • Yes, you are passing the array correctly; however, in C (and C++), arrays don't contain their size. So you need to pass the size of the array as a separate parameter. Arrays effectively decay into pointers when passed as a parameter into a function, so sizeof(vertices) will give you the size of the pointer type, not the size of the array. You can walk through the array though, either with pointer arithmetic or indexing - but you need to know its exact size, otherwise you can get out of bounds.

    This is one main reason why in C++ std::vector is recommended to use instead of raw arrays.