2

Please, help me with such common task as to write function that must return array. I spent 2 hours with solving this problem, but no results. Here is my code:

 VERTEX* ConstructVertices(float R, unsigned int Slices)
{
    //const unsigned int n = static_cast<const unsigned int>(Slices);
    VERTEX *__vertices = new VERTEX[100];

    float dx = (2 * R) / Slices;
    float dz = dx;
    float x, y, z;
    x = -R;
    y = 0.5f;
    z = 0;
    int x_sign = 1;
    int z_sign = -1;

    __vertices[0].Color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);
    __vertices[0].Pos = D3DXVECTOR3(x, y, z);

    for (int i=1; i<Slices * 4 + 1; i++)
    {
        __vertices[i].Color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);

        y = -y;

        if (y < 0)
        {
            __vertices[i].Pos = D3DXVECTOR3(x, y, z);
            continue;
        }

        x += x_sign * dx;
        z += z_sign * dz;

        x = round_up(x, 2);
        z = round_up(z, 2);

        if (abs(x) == abs(R))
        {
            x_sign = -x_sign;
        }
        if (abs(z) == abs(R))
        {
            z_sign = -z_sign;
        }

        __vertices[i].Pos = D3DXVECTOR3(x, y, z);   
    }

    return __vertices;
}

Code for accessing the array:

VERTEX *vertices = new VERTEX[100];
vertices = ConstructVertices(1, 10);

With Watches window i can see values like vertices[0], vertices[1],.. But i can't see it as an array & the main is sizeof(vertices) returns 4 instead of 160!!

Thank a lot!

4

4 回答 4

1

只需返回一个std::vector<VERTEX>.

返回指向在堆上分配的内存的指针有几个主要问题:

  1. 如果处理不当,内存很容易泄漏。
  2. 从界面上不清楚如何释放内存,编译器无法帮助使用正确的方法(尽管使用delete[] a;可能会猜测正确的方法是什么)。
  3. 您无法从指针确定返回数组的大小。

显然,您可以创建一个提供合适操作的类,但这就是事实std::vector<T>。如果您需要指向元素的指针,只需使用非空向量 ( &a[0]) 或a.data(). 后者是在 C++ 2011 中引入的,并且具有处理空数组的优势(当然,返回的指针不能被取消引用)。

于 2012-12-15T18:50:28.220 回答
1

在您的代码中,您首先动态分配内存:

VERTEX *vertices = new VERTEX[100];
vertices = ConstructVertices(1, 10);

然后在函数中使用 new 分配内存:

//const unsigned int n = static_cast<const unsigned int>(Slices);
VERTEX *__vertices = new VERTEX[100];

最后你返回这个指针并替换你创建的第一个指针。内存被分配了两次。

于 2012-12-15T18:51:29.437 回答
0

“主要是 sizeof(vertices) 返回 4 而不是 160!!” 那是因为 vertices 是一个指针,而且显然你使用的是一台高科技的 32 位计算机,所以指针的大小是 4 个字节。
还有一点是:

VERTEX *vertices = new VERTEX[100];
vertices = ConstructVertices(1, 10);

第一个分配是无用的,因为被第二个覆盖而没有使用过,所以你只是用 100 VERTEX 泄漏内存。

于 2012-12-15T18:51:07.737 回答
0

而不是这个

VERTEX *vertices = new VERTEX[100];
vertices = ConstructVertices(1, 10);

将顶点数组作为参数添加到函数并告诉函数大小

VERTEX *vertices = new VERTEX[100];
ConstructVertices(1, 10,vertices,100);

然后在你的函数里面填充传递的数组

void ConstructVertices(float R, 
                       unsigned int Slices,
                       VERTEX* vertices, 
                       size_t verticesArraySz )
{
    //const unsigned int n = static_cast<const unsigned int>(Slices);

    float dx = (2 * R) / Slices;
    float dz = dx;

...

不要使用类似的名称__vertices,这不是一个好习惯,因为通常编译器特定的东西使用该语法。

于 2012-12-15T19:54:41.520 回答