无法使用变量设置变量长度

时间:2012-04-06 14:59:01

标签: c++ arrays

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


int numtriangles = sector1.numtriangles;


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

5 个答案:

答案 0 :(得分:7)

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

您可以使用std::vector代替VLA。

答案 1 :(得分:4)

请参阅此问题Is there a way to initialize an array with non-constant variables? (C++)

简短的回答是不,你不能直接这样做。但是,您可以使用类似

的效果获得相同的效果
int arraySize = 10;
int * myArray = new int[arraySize];

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

您还可以使用允许您拥有可变长度数组的向量。我的示例允许您使用变量initailizer创建一个数组,但在我的示例中,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;
}

答案 2 :(得分:1)

使用STL。 如果您需要可变长度数组,可以使用#include<vector>

下的向量

Native c ++ array donot nave variable length array。

答案 3 :(得分: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,因为它肯定会使程序崩溃。

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

答案 4 :(得分: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 */