不能用变量设置可变长度

Can't set variable length with variable

本文关键字:设置 变量 不能      更新时间:2023-10-16

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


int numtriangles = sector1.numtriangles;

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

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

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

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

简短的回答是否定的,你不能直接这样做。但是,您可以通过类似的东西获得相同的效果

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

现在myArray是指向数组的指针,您可以像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;
}

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

本机 c++ 数组不中殿可变长度数组。

声明具有长度说明符的数组时,只允许使用常量。

实际上,当

编译程序时,会评估数组长度。

但请注意,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,因为它肯定会使您的程序崩溃。

准确地说,如果在函数中声明数组,它将使用程序

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

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