2012-04-06 59 views
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 

+1

可变长度数组不是在C++支持。它只是一个编译器扩展,如果它在其他平台上编译的话。 – Mahesh 2012-04-06 15:02:26

+0

[有没有办法用非常量变量初始化一个数组? (C++)](http://stackoverflow.com/questions/972705/is-there-a-way-to-initialize-an-array-with-non-constant-variables-c) – 2012-04-06 15:05:22

回答

7

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

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

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个项目。如果您不确定阵列使用矢量的时间有多长,并且您可以推送和放弃项目。

也请记住我的例子,因为你已经dyanmically分配的内存,您将需要释放内存当你在做类似

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; 
} 
+1

+1为提高动态内存分配。首选方法是让新手远离动态内存分配,并使用'std :: vector'来代替。 – 2012-04-06 16:00:26

1

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

原生C++数组donot nave可变长度数组。

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做这样的变量声明,因为它肯定会让你的程序崩溃。准确地说,如果在函数中声明了该数组,则它将使用程序堆栈上的空间,并且如果在全局上下文中声明,则将使用程序数据存储器。

+0

第n次**指针和数组是不一样的!**请停止传播这个废话! – 2012-04-06 15:15:20

+0

@Als“一个数组可以被认为是一个常量指针”更好? (来自http://www.cplusplus.com/doc/tutorial/pointers/) – SirDarius 2012-04-06 15:23:38

+0

不,这是错误的,该特定的网站是臭名昭着的臭名昭着。好读:[我如何使用C + +中的数组?](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c) – 2012-04-06 15:27:36

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 */