Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Func返回数组_C++ - Fatal编程技术网

C++ Func返回数组

C++ Func返回数组,c++,C++,请帮助我完成一些常见的任务,比如编写必须返回数组的函数。我花了两个小时来解决这个问题,但没有结果。这是我的密码: VERTEX* ConstructVertices(float R, unsigned int Slices) { //const unsigned int n = static_cast<const unsigned int>(Slices); VERTEX *__vertices = new VERTEX[100]; float dx =

请帮助我完成一些常见的任务,比如编写必须返回数组的函数。我花了两个小时来解决这个问题,但没有结果。这是我的密码:

 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;
}
通过Watches窗口,我可以看到顶点[0]、顶点[1]、,。。但是我不能把它看作一个数组&主要是sizeof(顶点)返回4而不是160


非常感谢

只需返回一个
std::vector

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

  • 如果处理不当,内存很容易泄漏
  • 从界面上看,不清楚如何释放内存,编译器也无法帮助使用正确的方法(尽管使用
    delete[]a;
    很可能是猜测正确的方法是什么)
  • 无法从指针确定返回数组的大小
  • 显然,您可以创建一个提供适当操作的类,但这就是
    std::vector
    的含义。如果需要指向元素的指针,只需使用非空向量(
    &a[0]
    )或
    a.data()
    的第一个元素的地址即可。后者用C++ 2011引入,并且还具有空数组的TGE优点(当然,返回指针不能被取消)。主要是sieof(顶点)返回4而不是160!“这是因为顶点是指针,显然您使用的是一种奇特的高技术32位计算机,指针的大小是4字节
    另一点是:

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

    第一个赋值是没有用的,因为第二个赋值被覆盖而从未使用过,所以您只会泄漏100个顶点的内存。

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

    VERTEX *vertices = new VERTEX[100];
    vertices = ConstructVertices(1, 10);
    
    然后在函数中为您的内存分配新的:

    //const unsigned int n = static_cast<const unsigned int>(Slices);
    VERTEX *__vertices = new VERTEX[100];
    
    //const unsigned int n=静态\u转换(片);
    顶点*_顶点=新顶点[100];
    
    最后,返回这个指针并替换创建的第一个指针。内存被分配两次。

    而不是这个

    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;
    
    ...
    
    void构造函数顶点(浮动R,
    无符号整数切片,
    顶点*顶点,
    尺寸(垂直阵列)
    {
    //const unsigned int n=静态_转换(切片);
    浮点dx=(2*R)/切片;
    浮点数dz=dx;
    ...
    

    不要使用像
    \uu顶点这样的名称,这不是一个好习惯,因为通常特定于编译器的东西都使用这种语法。

    我认为一个解释对初学者更有用。我需要一个数组作为最终结果。@JamesKanze:但是如果你不解释为什么向量更可取,那么你实际上就没有教过任何东西;你很简单这个人显然是一个初学者,我怀疑这个作业是否允许向量(好吧,假设它是一个作业,也许不是)不管什么专业实践,每个人编写C++代码都应该理解他们为什么要做他们正在做的事情。@ JAMESKANZE:我们不同意。当你告诉某人使用向量时,你应该解释为什么。他们应该已经有了对手动内存管理的基本理解,而且这是困难。从开始开始。g、 你将培养出更多有能力的软件开发人员。只告诉初学者“使用向量”是没有帮助的,我认为这种情况经常发生。理解概念比解决这个简单的实现问题更重要。如果你需要一个“数组”(可能是指向第一个元素的指针)您可以使用非空数组的第一个元素的地址(例如,<代码>和[0 ] < /COD>),或者,当使用C++ 2011时,可以使用<代码>数据()/代码>成员(它同样,但也适用于空向量)。。而不是100:
    无符号整数n_顶点=切片*4+1;
    您应该更改
    顶点的名称
    。为什么顶点[]={{D3DXVECTOR3(-1.0f,0.5f,0.0f),D3DXCOLOR(1.0f,0.0f,0.0f,1.0f)};sizeof(顶点)返回的不是4???Grmpf。那么它不是指针(好的,它也是一个指针,但调试器知道它指向一个数组),然后它是一个数组,它的大小由你传递的初始值设定项定义。但是说VERTEX*VERTEX,你只说这个东西指向一个顶点。在你的例子中,你的指针指向数组中的第一个顶点,所以顶点[1]将是下一个顶点。我知道这一点。但我不知道如何从指针指向其第一个元素时获取数组?在调用“constructVertexs”函数之前,不需要在指针上使用new。
    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;
    
    ...