3

我现在要做的是创建一个长度由变量定义的数组。但是,当我将变量放入数组长度时,它给了我一个“非 POD 元素类型'glm::vec2'的可变长度数组”错误。但是,如果我用实际数字替换变量,错误就会消失。为什么会发生这种情况,我该如何解决?


int numtriangles = sector1.numtriangles;


glm::vec2 tex[test]; //Using a variable generates an error
glm::vec3 vertices[10]; //No error here

4

5 回答 5

7

标准 C++中不能有可变长度数组 (VLA)
C++ 标准不允许可变长度数组。在 C++ 中,数组的长度需要是编译时间常数。一些编译器确实支持 VLA 作为编译器扩展,但使用它们会使您的代码在其他编译器中不可移植。

您可以使用,std::vector而不是 VLA。

于 2012-04-06T15:01:50.510 回答
4

看到这个问题有没有办法用非常量变量初始化数组?(C++)

简短的回答是不,你不能直接这样做。但是,您可以使用类似的方法获得相同的效果

int arraySize = 10;
int * myArray = new int[arraySize];

NowmyArray是指向数组的指针,您可以像访问数组一样访问它myArray[0],等等。

您还可以使用一个向量,它允许您拥有一个可变长度的数组。我的示例允许您使用变量初始化器创建一个数组,但myArray在我的示例中只有 10 个项目长。如果您不确定数组将使用矢量多长时间,您可以将项目推入并弹出它。

还要记住我的例子,因为你已经动态分配了内存,当你完成数组时,你需要通过执行类似的操作来释放该内存

delete[] myArray;

这是一个小示例应用程序来说明这一点

#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    int arraySize = 10;
    int * myArray = new int[arraySize];
    myArray[0] = 1;
    cout << myArray[0] << endl;

    delete[] myArray;
}
于 2012-04-06T15:04:38.807 回答
1

使用 STL。如果你想要一个可变长度数组,你可以在下面使用向量#include<vector>

本机 c++ 数组不包含可变长度数组。

于 2012-04-06T15:06:29.723 回答
0

当您使用长度说明符声明数组时,只允许使用常量。

实际上是在编译程序时评估数组长度。

但是请注意,在 C++ 中声明int test[];像编译器无法知道为变量分配多少空间是非法的。

如果没有长度说明符,就没有为数组保留的实际内存,您必须求助于使用指针和动态内存分配:

int * test = new int[12];
// or
int * test = new int[val]; // variable works here

// and don't forget to free it
delete [] test;

使用int test[12]实际上创建了一个数组,该数组在编译时一劳永逸地静态初始化以包含 12 个整数。永远不要尝试delete [] test使用这种方式声明的变量,因为它肯定会让你的程序崩溃。

准确地说,如果数组在函数中声明,它将使用程序堆栈上的空间,如果在全局上下文中声明,则将使用程序数据内存。

于 2012-04-06T15:13:35.180 回答
0

C++ 不支持声明可变长度数组。所以要使用一个长度的数组,你可以

  1. 假设一个大数字是数组的最大可能长度。现在声明一个该大小的数组。并通过假设它是您想要的长度的数组来使用它。

    #define MAX_LENGTH 1000000000
    glm::vec2 tex[MAX_LENGTH];
    

    迭代它

    for(i=0; i<test; i++) {
        tex[i];
    }
    

    注意:此方法不会最小化内存使用。

  2. 使用指针并根据您的长度分配它。

    glm::vec2 *tex;
    tex = new glm::vec2[test];
    

    在这里输入代码

    for(i=0; i<test; i++) {
        tex[i];
    }
    delete [] tex; // deallocation
    

    注意:两次释放内存会发生错误。

  3. 使用其他类似数组的数据结构。

    vector<glm::vec2> tex;
    for(i=0; i<test; i++){ 
        tex.push_back(input_item);
    }
    /* test.size() return the current length */
    
于 2012-04-06T15:36:29.683 回答