2011-01-23 3 views
1

У меня есть станд :: вектор определяется как:Можете ли вы использовать размер вектора как длину массива?

std::vector<glm::vec3> faces; 

И я хочу, чтобы использовать размер этого вектора как длина массива поплавков. Сейчас я пытаюсь сделать это вот так:

float vertices[faces.size()][3]; 

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

const int size = faces.size(); 
float vertices[size][3]; 

Но я все еще получаю ту же ошибку. Можно ли сделать это?

+0

Могу ли я спросить, почему вы хотите сделать такое? Это похоже на то, что должно быть лучшее решение. –

+0

Я пытаюсь сделать загрузчик .obj для OpenGL, и в настоящее время я читаю все содержимое и сохраняю их в вектор.Основываясь на том, что я знаю из учебника, за которым я следую прямо сейчас, мне нужно отправить данные вершин как гигантский массив поплавков, так как я использую Vertex Buffer Objects. Я думал, что это был бы хороший способ сделать это, но на основе всех комментариев до сих пор кажется, что, вероятно, было бы лучше, если бы я нашел библиотеку для загрузки моделей для меня. Я помню, как однажды пытался найти его, но не смог найти хороших. – krej

+1

Вы должны задать вопрос. –

ответ

4

Почему вы все равно хотите использовать массив C? A vector было бы гораздо более уместным здесь.

vector<vector<float> > vertices(faces.size(), vector<float>(3)); 

И если вы уже знаете, размер внутреннего вектора и его размер фиксирован, это безопасная ставка, что структура будет лучше подходит, чем вектор здесь:

struct vertex { 
    float x; 
    float y; 
    float z; 
}; 

vector<vertex> vertices(faces.size()); 

полезности В векторах типа С строго ограничен в C++. Единственное использование - это в основном, если вы знаете свой размер (и обычно также содержимое) во время компиляции и используете их в качестве прославленной константы. Для всего остального существуют лучшие контейнеры. И даже эта ниша заполняется в следующем стандарте std::array.

2

Не в стандартном C++ (хотя я считаю, что некоторые компиляторы предлагают его как нестандартное языковое расширение).

Вы могли бы сделать что-то вроде:

float (*vertices)[3] = new int[faces.size()][3]; 

Обратите внимание, что теперь это была выделена в куче, так что вам нужно delete [] vertices в какой-то момент.

0

Вы не можете определить массив объектов в стеке (так называемые автоматические переменные) с неопределенным размером массива. Размер массива должен быть известен во время компиляции. Как еще компилятор знал, сколько пространства стека зарезервировать для массива?

Если вам нужен массив, размер которого не определен до выполнения, вы должны использовать новый оператор для определения массива в куче.

1

Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь использовать не константное выражение для создания размера массива во время компиляции. Вектор :: размер - это операция выполнения. Во втором примере, хотя вы можете подумать, что вы умны, компилятор более чем вероятно оптимизирует эту переменную и выводит, что вы, по сути, используете некоторое количество, которое будет известно только во время выполнения.

Если вам не нужно интегрироваться с библиотекой C или чем-то наследием (я вижу, что вы используете вызовы OpenGL, которые являются C) Я бы посоветовал вам взглянуть на Boost::multi_array. Следовательно,

boost::multi_array<float,2> myFloats(boost::extents[myVector.size()][3]); 
Смежные вопросы