Russian Qt Forum
Ноябрь 24, 2024, 07:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Запись текстуры в нулевой массив (Bug?)  (Прочитано 3197 раз)
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.
« Последнее редактирование: Январь 19, 2012, 15:54 от Disa » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 17, 2012, 14:36 »

Ты портишь память. В чем вопрос-то?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Disa
Гость
« Ответ #2 : Январь 17, 2012, 14:45 »

Всегда думал, что в таких случаях должна быть утечка с аварийным завершение (или что-то типа этого), а не дальнейшая запись в память. Вопрос в том, как это сработало, да и при том почти правильно?  Улыбающийся

За ранее благодарен.
« Последнее редактирование: Январь 17, 2012, 14:47 от Disa » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Январь 17, 2012, 14:50 »

Ты просто сделал запись в другое место. Аварийное завершение тебе никто не обещал, но данные ты похерил. В общем, все тут зависит от фазы луны, не делай так больше.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
mutineer
Гость
« Ответ #4 : Январь 17, 2012, 14:52 »

Нет, за запись за пределы массива динозавр тебя не укусит (то бишь ниче никуда сразу не вылетит), а вот потом будет очень хреново искать ошибку
Записан
Disa
Гость
« Ответ #5 : Январь 17, 2012, 15:00 »

Спасибо большое за ответы. Да я бы с удовольствием не делал бы, сам искал где-то 2а часа почему координаты мыши неправильно считаются.  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.