0

将数组元素传递给争论后,我在计算数组元素时遇到问题

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..............

}

在上面的以下行中

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

我正在尝试计算数组变量顶点中的元素数。但我没有得到准确的计数,如果没有的话。

当我逐步完成时,我注意到我无法看到数组中的所有值,只能看到数组的第一个值。

所以我不确定我是否正确地传递了数组作为争论。在另一个应用程序中,我做了同样的事情,我能够看到逐步完成的所有值。我像这样传递数组。

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

所以简而言之,我是否将数组作为论据正确传递,我做错了什么,我无法获得数组的正确元素计数。

4

6 回答 6

3

是的,您正确地传递了数组;但是,在 C(和 C++)中,数组不包含它们的大小。因此,您需要将数组的大小作为单独的参数传递。当作为参数传递给函数时,数组有效地衰减为指针sizeof(vertices),因此会给您指针类型的大小,而不是数组的大小。不过,您可以使用指针算术或索引遍历数组 - 但您需要知道它的确切大小,否则您可能会越界。

std::vector这是建议在 C++ 中使用而不是原始数组的主要原因之一。

于 2010-06-30T16:32:59.413 回答
1

您正确地传递了数组。数组参数根本不记得它们的长度。相反,它们被传递就好像它们只是指针一样,因此您的sizeof表达式正在获取指针的大小,而不是指针指向的整个数组的大小。

如果函数需要知道数组的长度,那么您需要将长度作为附加参数传递。

于 2010-06-30T16:31:34.080 回答
1

除非您在函数声明中明确指定数组长度,否则 C 数组(这是您要传递的)不会传递大小(长度)。在 C 中解决这个问题的典型方法是将数组长度传递给函数以及数组。

在 C++ 中,更好的是使用 astd::vector并传递它。它已经知道自己的大小,问题就完全消失了。

于 2010-06-30T16:34:12.903 回答
1

您正在执行的sizeof(vertices)操作不是运行时操作,它实际上是由编译器解析的。所以,只要数组的声明在作用域内,就会得到正确的结果。

在函数中并非如此,因为您可能从代码中的其他几个点传递数组,因此结果不正确。(因此调试器也会感到困惑)。

于 2010-06-30T16:34:33.150 回答
1

当你像这样传递数组时,数组会衰减为指针。你认为这有什么意义UINT indices[] = NULL

您可以使用数组传递长度,就像在 C 中那样,或者您可以使用一些更智能的构造,例如向量或 boost::array。

于 2010-06-30T16:34:45.267 回答
0

Csizeof运算符在编译时计算,而不是在运行时计算。正如所写,编译器没有足够的信息来确定数组的大小。

相反,更改您的函数原型。传入指向数组的指针以及数组的长度。

于 2010-06-30T16:35:17.983 回答