Вопрос по c++, arrays – Не могу установить переменную длину с переменной

3

То, что я сейчас пытаюсь сделать, - это создать массив с длиной, определяемой переменной. Однако, когда я помещаю переменную в длину массива, она дает мне «массив переменной длины типа элемента, отличного от POD»: «glm :: vec2»; ошибка. Однако, если я заменю переменную на фактическое число, ошибка исчезнет. Почему это происходит и как я могу это исправить?

<code>
int numtriangles = sector1.numtriangles;


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

</code>
Массивы переменной длины не поддерживаются в C ++. Это просто расширение компилятора, и если оно компилируется на других платформах. Mahesh
возможный дубликатIs there a way to initialize an array with non-constant variables? (C++) Anders Abel

Ваш Ответ

5   ответов
7

variable length arrays(VLA) в стандарте C ++.
Стандарты C ++ не допускают использование массивов переменной длины. В C ++ длина массива должна быть постоянной времени компиляции. Некоторые компиляторы поддерживают VLA как расширение компилятора, но их использование делает ваш код непереносимым по сравнению с другими компиляторами.

Ты можешь использовать,std::vector вместо VLA.

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 с переменной, объявленной таким образом, поскольку это, безусловно, приведет к аварийному завершению вашей программы.

Если быть точным, если массив объявлен в функции, он будет использовать пространство в программном стеке, а если объявлен в глобальном контексте, будет использоваться память данных программы.

Нет, это просто неправильно, этот конкретный сайт известен своими ошибками. Хорошо для чтения:How do I use arrays in C++?
ДляnвремяPointers and arrays are not the same thing! Пожалуйста, прекратите распространяться вокруг этой ерунды !!
@Als & quot; массив можно считать постоянным указателем & quot; лучше ? (отcplusplus.com/doc/tutorial/pointers)
я слишком стар, чтобы спорить, и в любом случае это тоже не место для этого.
4

Есть ли способ инициализировать массив с непостоянными переменными? (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;
}
+1 за динамическое выделение памяти. Предпочтительный метод для новичков, чтобы держаться подальше от динамического выделения памяти и использованияstd::vector вместо.
1

Если вы хотите массив переменной длины, вы можете использовать векторы под#include<vector>

Родной массив c ++ не имеет массива переменной длины.

0

м, чтобы использовать массив с длиной, вы можете

Assume a big number which is highest possible length of your array. Now declare an array of that size. And use it by assuming that it an array of your desire length.

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

to iterate it

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

Note: memory use will not minimized in this method.

Use pointer and allocate it according your length.

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

enter code here

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

Note: deallocation of memory twice will occur a error.

Use other data structure which behave like array.

vector<glm::vec2> tex;
for(i=0; i<test; i++){ 
    tex.push_back(input_item);
}
/* test.size() return the current length */

Похожие вопросы