Инициализация многомерного массива GLfloats в C ++

0

У меня в настоящее время есть узел в моем мозгу о том, как правильно инициализировать массив GLFloats по строкам. Насколько я знаю, массив можно было бы написать так:

int a[2][2] = {{1,2},{3,4}}

В моем случае у меня есть массив

GLfloat targetVertices[10][72];

для вершин шести сторон кубов (точнее, десяти кубов). Координаты куба сохраняются в

float targetX[10], targetY[10], targetZ[10];

массивы. Я хотел бы инициализировать его следующим образом:

for(iii = 0; iii <= 9; iii++) {
    targetVertices[iii] = {                  /*Side 1*/
                           targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1,
                           targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1,
                           targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1,
                           targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1,
                                             /*Side 2*/
                           targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1,
                           targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1,
                                             /*Side 3*/
                           targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1,
                           targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1,
                                             /*Side 4*/
                           targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1,
                           targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1,
                                             /*Side 5*/
                           targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1,
                           targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1,
                           targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1,
                           targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1,
                                             /*Side 6*/
                           targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1,
                           targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1,
                           targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1
                          };
}

К сожалению, мне всегда говорят о синтаксической ошибке относительно самой первой squiggly-скобки (C2059 и C2143, но это не имеет никакого смысла для меня там). Надеюсь, мой вопрос ясен, и кто-то может мне помочь. Я не нашел ничего похожего на мою проблему на этом или любом другом сайте.

Заранее спасибо!

Теги:
arrays
multidimensional-array

1 ответ

1
Лучший ответ

Проблема с вашим синтаксисом заключается в следующем: targetVertices [iii] вы ссылаетесь на индекс iith массива, а не на весь столбец. 2D-массивы хранятся как массивы 1D, но предоставляют [] [] для простого доступа. Вы можете ссылаться на них как на одномерные, так и на двухмерные.

Вот более подходящий способ подойти к этому.

void addVertex(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z)
{
    data.push_back(x);
    data.push_back(y);
    data.push_back(z);
}

void addCube(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z)
{
    addVertex(data, x-1, y-1, z-1);
    addVertex(data, x-1, y-1, z+1);
    addVertex(data, x-1, y+1, z+1);
    addVertex(data, x-1, y+1, z-1);

    addVertex(data, x+1, y-1, z-1);
    addVertex(data, x+1, y-1, z+1);
    addVertex(data, x+1, y+1, z+1);
    addVertex(data, x+1, y+1, z-1);

    addVertex(data, x-1, y-1, z-1);
    addVertex(data, x-1, y-1, z+1);
    addVertex(data, x+1, y-1, z+1);
    addVertex(data, x+1, y-1, z-1);

    addVertex(data, x-1, y+1, z-1);
    addVertex(data, x-1, y+1, z+1);
    addVertex(data, x+1, y+1, z+1);
    addVertex(data, x+1, y+1, z-1);

    addVertex(data, x-1, y-1, z-1);
    addVertex(data, x-1, y+1, z-1);
    addVertex(data, x+1, y+1, z-1);
    addVertex(data, x+1, y-1, z-1);

    addVertex(data, x-1, y-1, z+1);
    addVertex(data, x-1, y+1, z+1);
    addVertex(data, x+1, y+1, z+1);
    addVertex(data, x+1, y-1, z+1);
}

void makeCubes(std::vector<GLfloat> &data)
{
    float targetX[10], targetY[10], targetZ[10];
            data.clear();
            data.reserve(720);

    //...initialize the above arrays...

    for (int i=0; i<10; i++)
    {
        std::vector<GLfloat> newData;
        addCube(newData, targetX[i], targetY[i], targetZ[i]);
        data.insert(data.begin(), newData.begin(), newData.end());
    }
}

Вы можете легко преобразовать это в C-массив, взяв ссылку на первый элемент:

std::vector<GLfloat> data;
makeCubes(data);
GLfloat *cArray = &data[0];

Вызов glBufferData можно сделать следующим образом:

glBufferData(GL_ARRAY_BUFFER,
             data.size()*sizeof(GLfloat),
             &data[0],
             GL_STREAM_DRAW);
  • 0
    Большое спасибо, я постараюсь реализовать ваше решение. Однако, в целях понимания, почему я не могу просто присваивать данные построчно моему массиву? Это работает для массивов символов (по крайней мере, в ANSI-C). Кроме того, я, возможно, неправильно сформулировал, так как это не инициализация как таковая, а скорее присваивание (я делаю инициализацию в двух вложенных циклах for заранее, для всех нулей). Может ли это работать, используя ключевое слово "new"? Как в написании GLfloat * targetVertices; в моем заголовочном файле и в конструкторе targetVertices = new GLfloat [] []; или что-то?
  • 0
    Проблема с вашим синтаксисом заключается в том, что targetVertices [iii] вы ссылаетесь на индекс iiith массива, а не на весь столбец. Смотрите, 2D-массивы хранятся как 1D-массивы, но предоставляют [] [] для простого доступа. Вы можете ссылаться на них как одномерные или двухмерные. Не будет необходимости в «новом», если вы уже разместили массив 10x72.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню