3

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

То, что я сейчас пытаюсь сделать, - это создать массив с длиной, определяемой переменной. Однако, когда я помещаю переменную в длину массива, она дает мне «массив переменной длины типа элемента, отличного от 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 за динамическое выделение памяти. Предпочтительный метод для новичков, чтобы держаться подальше от динамического выделения памяти и использованияstd::vector вместо.

    от
  • я слишком стар, чтобы спорить, и в любом случае это тоже не место для этого.

    от
  • Нет, это просто неправильно, этот конкретный сайт известен своими ошибками. Хорошо для чтения:How do I use arrays in C++?

    от
  • @Als & quot; массив можно считать постоянным указателем & quot; лучше ? (отcplusplus.com/doc/tutorial/pointers)

    от
  • ДляnвремяPointers and arrays are not the same thing! Пожалуйста, прекратите распространяться вокруг этой ерунды !!

    от
  • Массивы переменной длины не поддерживаются в 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 ++ не поддерживает объявление массива переменной длины. Таким образо

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

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

  • 1

    использовать STL.

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

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

  • 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;
    }
    

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

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