Рисуем прямоугольную сетку 8 x 15 в C ++ с OpenGL - сбой - PullRequest
1 голос
/ 19 октября 2019

Я хочу создать Матрицу прямоугольников 8 х 15 в C ++ с OpenGl. Сначала я создаю класс для прямоугольника. Затем я создал класс для ряда прямоугольников, он содержит массив из 8 прямоугольников. Затем я создал класс для 15 строк (вся матрица).

Я думаю, у меня проблема с указателем ... Вот что я сделал для тестирования:

создал 1..2 прямоугольникая нарисовал их - хорошо
создал 1..2 строки и нарисовал их - хорошо
создал 1 поле и нарисовал его - хорошо
создал 2 матрицы - окна просто открылись и разбились ... это былобелый с ошибкой msg xD

Так что это моя функция отображения ... она работает, например, для 3 строк. но если бы я вставил MatrixRectangles field1(0,0); и MatrixRectangles field2(0,0); и распечатал бы все в функции отображения с void drawAllRows();, это не сработало бы.

void display(void) {
    // glClearColor(1,1,1,0);
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(0, 0, 0.01, 0, 0, 0, 0, 1, 0);
    glBegin(GL_LINE_LOOP);
    glVertex3f(-1, -1, 0);
    glVertex3f(0, 1, 0);
    glVertex3f(1, -1, 0);
    glEnd();

    row1.drawAllRectangles();
    row2.drawAllRectangles();
    row3.drawAllRectangles();
    glFlush();
}


class RectangleGL {
public:
    RectangleGL();
    RectangleGL(float hoehe, float breite, float startx, float starty);
    virtual ~RectangleGL();
    float getWidth() const;
    float getHight() const;
    void setBreite(float breite);
    void setHight(float hohe);
    void drawRectangle();
    float getStartx() const;
    void setStartx(float startx);
    void printRectangleData();
    void setStarty(float starty);
private:
    float hight;
    float width;
    float startx;
    float starty;
};

#endif /* VIERECKGL_H_ 

/*
 * Reihe_ViereckeGL.cpp
 *
 *  Created on: 19.10.2019
 *      Author: N1
 */

#include "Reihe_ViereckeGL.h"
rowRectangle::rowRectangle() {
    // TODO Auto-generated constructor stub

}
rowRectangle::rowRectangle(float startx,float starty) {
    // TODO Auto-generated constructor stub
    for (int i = 0; i < 8; i++) {
        float m = i * 0.1;
        this->rectangles[i] = new RectangleGL(0.1, 0.1, m+startx, starty); // always a new x position , everytime higher...

    }
}

rowRectangle::~rowRectangle() {
    // TODO Auto-generated destructor stub
}

float rowRectangle::getStarty() const {
    return starty;
}

void rowRectangle::setStarty(float starty) {
    this->starty = starty;
}

void rowRectangle::drawAllRectangles() {

    for (int i = 0; i < 8; i++) {

        this->rectangles[i]->drawRectangle();
    }
}
/*
 * Reihe_ViereckeGL.h
 *
 *  Created on: 19.10.2019
 *      Author: N1
 */

#ifndef REIHE_VIERECKEGL_H_
#define REIHE_VIERECKEGL_H_
#include "ViereckGL.h"
class rowRectangle {
public:
    rowRectangle();
    rowRectangle(float startx,float starty);
    virtual ~rowRectangle();
    float getStarty() const;
    void setStarty(float starty);
    void drawAllRectangles();
    RectangleGL* rectangles[8];
private:
    int anzReihe;
    int rowNr;
    float startx; // offset x..
    float starty; // offset... y
};

#endif /* REIHE_VIERECKEGL_H_ */
/*
 * FeldViereckeGL.h
 *
 *  Created on: 19.10.2019
 *      Author: N1
 */

#ifndef FELDVIERECKEGL_H_
#define FELDVIERECKEGL_H_
#include "Reihe_ViereckeGL.h"
class MatrixRectangles {
public:
    MatrixRectangles(float startx, float starty);
    virtual ~MatrixRectangles();
    rowRectangle *rowRectangles[8];
    void drawAllRows();
};

#endif /* FELDVIERECKEGL_H_ */

    /*
     * FeldViereckeGL.cpp
     *
     *  Created on: 19.10.2019
     *      Author: N1
     */

    #include "FeldViereckeGL.h"

    MatrixRectangles::MatrixRectangles(float startx, float starty) {
        // TODO Auto-generated constructor stub
        for (int i = 0; i < 15; i++) {
            float m = i * 0.1;
            this->rowRectangles[i] = new rowRectangle(startx, m + starty); // everytime a higher position
        }
    }

    MatrixRectangles::~MatrixRectangles() {
        // TODO Auto-generated destructor stub
    }
    void MatrixRectangles::drawAllRows() {
        // zeichne alle reihen
        for (int i = 0; i < 15; i++) {
            rowRectangles[i]->drawAllRectangles(); // draw all rectangles !
        }
    }

я бы ожидал хорошую матрицу прямоугольников 8х15. Но вместо этого окно, которое открывается, падает - оно становится белым - ",,, exe больше не работает"

1 Ответ

2 голосов
/ 20 октября 2019

В вашем массиве строк только 8 элементов:

rowRectangle *rowRectangles[8];

Однако вы выполняете итерацию по 15 элементам:

for (int i = 0; i < 15; i++) {
    float m = i * 0.1;
    this->rowRectangles[i] = new rowRectangle(startx, m + starty); // everytime a higher position
}

Вот почему он аварийно завершается.

Хорошей практикой является определение постоянной переменной для числа строк.

static constexpr int numRows = 15;
rowRectangle *rowRectangles[numRows];

И везде используйте numRows вместо 15. Это предотвратит ошибки в будущем. И когда вам нужно изменить количество строк, вам нужно сделать это только в одном месте.

...