OpenGL: поток 1: EXC_BAD_ACCESS (код = EXC_I386_GPFLT) - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть массив точек, которые нужно нарисовать в виде треугольника.Перед размещением их на экране я использую функцию для перевода их положения.Однако вызов функции translate для массива приводит к появлению вышеуказанной ошибки.

    float positions[6] = {
    -0.5f, -0.5f,
    0.0f, 0.5f,
    0.5f, -0.5f
};

//Basic Translate function
void basicTranslate(float Tx, float Ty){
    for(int i=0; i<sizeof(positions); i++){
        if(i % 2 == 0)
            positions[i] += Tx;
        else
            positions[i] += Ty;
    }
}

Ошибка возникает, когда я перевожу функцию перед работой с моими буферами и массивом вершин

    basicTranslate(2, 1);

    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
    GLuint vao = 0;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

1 Ответ

0 голосов
/ 19 сентября 2018

sizeof(positions) дает размер типа данных float[6] в байтах, который равен 4*6=24.
См. sizeof operator

Измените условие вцикл для решения проблемы:

for(int i=0; i<6; i++)

В C ++ я бы рекомендовал использовать std::vector или std::array, оба предоставляют метод size(),который возвращает количество элементов в контейнере:

#include <vector>

std::vector<float> positions = {
    -0.5f, -0.5f,
     0.0f,  0.5f,
     0.5f, -0.5f
};

void basicTranslate(float Tx, float Ty)
{
    for(size_t i=0; i<positions.size(); i++)
        positions[i] += (i % 2 == 0) ? Tx : Ty;
}
...