我现在要做的是创建一个长度由变量定义的数组。但是,当我将变量放入数组长度时,它给了我一个“可变长度数组的非POD元素类型'glm :: vec2'”错误。但是,如果我用实际数字替换变量,则错误消失。为什么会发生这种情况?我该如何解决这个问题?
int numtriangles = sector1.numtriangles;
glm::vec2 tex[test]; //Using a variable generates an error
glm::vec3 vertices[10]; //No error here
答案 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 ++不支持声明变量长度数组。所以要使用长度可能
的数组假设 一个很大的数字,它是你的数组最高可能的长度。现在声明一个大小的数组。并通过假设它是你的欲望长度的数组来使用它。
#define MAX_LENGTH 1000000000
glm::vec2 tex[MAX_LENGTH];
迭代它
for(i=0; i<test; i++) {
tex[i];
}
注意:此方法中的内存使用不会最小化。
使用指针并根据您的长度进行分配。
glm::vec2 *tex;
tex = new glm::vec2[test];
在这里输入代码
for(i=0; i<test; i++) {
tex[i];
}
delete [] tex; // deallocation
注意:重新分配内存两次会发生错误。
使用行为类似于数组的其他数据结构。
vector<glm::vec2> tex;
for(i=0; i<test; i++){
tex.push_back(input_item);
}
/* test.size() return the current length */