Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Disa от Январь 17, 2012, 14:33



Название: [РЕШЕНО] Запись текстуры в нулевой массив (Bug?)
Отправлено: Disa от Январь 17, 2012, 14:33
Добрый день. Решил поделиться наблюдением и заодно спросить у экспертов.
Имеется класс для виджета c OpenGL, вот кусок кода из его хедер-файла:

Код:
class editorScene : public QGLWidget { 
...
GLuint current_texture[0];  //  Да-да, именно 0, читайте ниже...
QPoint ptr_mouse_position;
...
}

В файле с реализацией методов помимо всех есть реализация наследованного метода для курсора мыши:
Код:
void editorScene::mouseMoveEvent(QMouseEvent* pe) {
  x_translate +=  (pe->x() - ptr_mouse_position.x()) / (200 * zoom);
  y_translate -=   (pe->y() - ptr_mouse_position.y()) / (200 * zoom);

  ptr_mouse_position = pe->pos();
  updateGL();
}

И так же есть метод загрузки текущий для загрузки текущей текстуры (можно было сделать конечно как дружественную хелпер-функцию, но не суть):

Код:
void editorScene::LoadGLTextures(const QString &filename) {
    QImage img;
    img.load(filename);

    if (!img.load(filename)) {
      std::cerr << "Cannot read texture file\n";
      return;
    }

    QImage GL_formatted_image;
    GL_formatted_image = QGLWidget::convertToGLFormat(img);

    if(GL_formatted_image.isNull()) {
      std::cerr << "GL_formatted_image empty\n";
      return;
    }

    glGenTextures(1, current_texture);
    glBindTexture(GL_TEXTURE_2D, current_texture[0]);
    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
                         GL_formatted_image.width(),   GL_formatted_image.height(),
                         0, GL_RGBA, GL_UNSIGNED_BYTE, GL_formatted_image.bits());

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,  GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}

Немсотря на то, что у нас current_texture это массив из 0 эллементов, все компилируется (qt 4.7.4 (qtCreator 2.3, g++ 4.2) / macOs 10.6).
Причем все еще при этом рисуется! Но координаты мыши по оси Oy в итоге считаются совершенно фантастическим образом. При замене в объявлении current_texture[0] на current_texture[1] все работает как часы. Точно не уверен, но видимо при компиляции все же под массив выделяется почти достаточно памяти для текстуры одной, но часть еще дописывается куда-то в ptr_mouse_position.


Название: Re: Запись текстуры в нулевой массив (Bug?)
Отправлено: Пантер от Январь 17, 2012, 14:36
Ты портишь память. В чем вопрос-то?


Название: Re: Запись текстуры в нулевой массив (Bug?)
Отправлено: Disa от Январь 17, 2012, 14:45
Всегда думал, что в таких случаях должна быть утечка с аварийным завершение (или что-то типа этого), а не дальнейшая запись в память. Вопрос в том, как это сработало, да и при том почти правильно?  :)

За ранее благодарен.


Название: Re: Запись текстуры в нулевой массив (Bug?)
Отправлено: Пантер от Январь 17, 2012, 14:50
Ты просто сделал запись в другое место. Аварийное завершение тебе никто не обещал, но данные ты похерил. В общем, все тут зависит от фазы луны, не делай так больше.


Название: Re: Запись текстуры в нулевой массив (Bug?)
Отправлено: mutineer от Январь 17, 2012, 14:52
Нет, за запись за пределы массива динозавр тебя не укусит (то бишь ниче никуда сразу не вылетит), а вот потом будет очень хреново искать ошибку


Название: Re: Запись текстуры в нулевой массив (Bug?)
Отправлено: Disa от Январь 17, 2012, 15:00
Спасибо большое за ответы. Да я бы с удовольствием не делал бы, сам искал где-то 2а часа почему координаты мыши неправильно считаются.  :)