@Pudjak

Как правильно передавать указатель на массив из класса С++?

Или может быть вопрос не в этом даже...
Есть такие два класса
class MainWidget : public QOpenGLWidget
{
public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();
    int vertex_counter = -1;
    int index_counter = -1;
    int *indexx;
    double *vertexx;
 
};
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
 
private:
    Ui::Widget *ui;
 
public slots:
    void update();
 
};

Elements - это структура с 2мя массивами и 2мя обычными интами.
И есть вот такие функции:
void Widget::update()
{
    Elements elements;
    myMain(&elements);
    ui->label->clear();
    ui->openGLWidget->vertex_counter = elements.vertex_counter;
    ui->openGLWidget->index_counter = elements.index_counter;
    ui->openGLWidget->indexx = elements.index;
    ui->openGLWidget->vertexx = elements.vertex;
    ui->openGLWidget->update();
    free(elements.vertex);
    free(elements.index);
}
 
void MainWidget::paintGL() {
    if (index_counter == -1) {
 
    } else {
        Elements elements;
        myMain(&elements);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glVertexPointer(3, GL_DOUBLE, 0, elements.vertex);
 
    glEnableClientState(GL_VERTEX_ARRAY);
    int edges_counter = elements.index_counter*2;
    glColor3d(40, 40, 20);
 
    glDrawElements(GL_LINES, edges_counter, GL_UNSIGNED_INT, elements.index);
    glRotatef(10, 0, 1, 0);
    glRotatef(10, 1, 0, 0);
    glDisableClientState(GL_VERTEX_ARRAY);
 
}
}

Получается вот в чём проблема. Я 2 раза вызываю функцию myMain (в ней заполняется структура elements). Если я её вызову в paintGL, то проблем нет, все корректно считается и отрисовывает. Но если я вызову её в update(), а в paintGL() попробую использовать переменные, полученные при её вызове в update(), то вот что получается. Два int'a (vertex_counter и index_counter из класса MainWidget) нормально всё передаются, с ними проблем нет. Но вот оба массива из этого класса нормально почему-то передать не могу. То есть, в функции update() у них те значения, которые и должны быть, а вот когда пытаюсь обратиться к ним в paintGL(), там будто-бы какой-то хлам.
В чём может быть проблема?
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dima20155
you don't choose c++. It chooses you
Время жизни локальной переменной, объявленной внутри функции - тело функции.
Поэтому если вы пишите
Elements* foo() {
Elements elements;
myMain(&elements);
}
void bar(Elements& e) {
// здесь состояние elements невалидное, обычные переменные, которые лежат внутри elements ещё чудом могут остаться валидными, а вот динамические массивы нет, так как вы их же руками и очищаете в free.
}


Если вопрос состоит в другом, то пожалуйста приведите не целую кучу кода (большинство из которого лишнее), а всего 3-4 строчки с комментарием как вы вызываете и что и где невалидно становится, иначе трудно понять.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы