Чрезмерно усердный способ делать работу без звонка? C ++ Glut инициализация пошла не так - PullRequest
0 голосов
/ 29 августа 2010

новичок C ++ здесь еще программист.

Я использую компилятор VC ++ VS2008 и библиотеку перенасыщения.Все работает нормально и в актуальном состоянии (я знаю, что 2010 год просто cba из-за причин поддержки XNA (C #))

Хорошо, на этот раз у меня есть вопрос, связанный с кодом, но я могу заставить код работать.Что я не могу сделать, так это выяснить, что происходит под капотом.Это то, что я хотел бы выяснить.

Предположим, что все работает, потому что ясно, что во время выполнения это работает!

Вот код (сводится к минимуму того, что на самом деле работает на голом ядре, чтобы ускорить работуэто наверх)

#include "stdafx.h"
#include "Controller.h"
#include "glut.h"
#include <iostream>

void main(int argc, char** argv) 
{   
    glutInit(&argc, argv);
    //controller_ptr->InitController();  <---- no link to controller-->DrawScene

    //INIT GLUT
    //glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    //glutInitWindowSize(400, 400); //Set the window size
    //glutCreateWindow("Some Program"); 

    //INIT RENDERING
    glEnable(GL_DEPTH_TEST);

    glutDisplayFunc(drawScene);
    glutKeyboardFunc(handleKeypress);
    glutReshapeFunc(handleResize);
    glutMainLoop();
}

Возможно, вы думаете, эй, у вас есть комментарий к init-коду.Я действительно делаю.Угадайте, что это все еще работает!Зачем?Я на самом деле не ЗНАЮ, что у вас есть перенасыщение, кроме как на барбекю, так что вы ... <---- Это может быть хорошей идеей для вас, чтобы вызвать сбой, если он есть </p>

У меня есть класс drawscene с этим методом

void DrawScene::initGlut()
{
    //Enables depth culling/front face culling??????  <----- what about that, some   depth thingy was involved is all I'm sure of
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(400, 400); //Set the window size
    glutCreateWindow("Some Program"); 
}

Когда я комментирую это и раскомментирую один в основном, тот же результат.Я ничего не комментирую, перенасыщение говорит, что init делается дважды, я не комментирую, init не делается, все идет в гору.Таким образом, единственным логическим выводом было бы сказать, что этот метод вызывается, верно?

Существует множество других методов и классов, но нет ни класса displayescene, ни класса контроллера.Я могу прокомментировать включения, и они будут делать то же самое.

Есть ли какая-то часть дизайна, которую я не понимаю в разработке MSbuild или VC ++, которая позволяет методам просеивать какой-то поток или поток, о котором я не знаю?Насколько мне известно, если я не создаю экземпляр класса, это не актуально, по крайней мере, это нестатические члены.Итак, как этот код, будучи активным или неактивным в этом члене, может повлиять на мою программу?

Возможно, забыл что-то невероятно глупое, но я все равно предпочел бы узнать как можно скорее, хорошая роль в том, чтобы быть новичкомчто мне наплевать на то, что я упаду на лице и попытаюсь снова, так что стреляйте с комментариями ^^

Большое спасибо заранее!

РЕДАКТИРОВАТЬ: Что за?Теперь консоль без каких-либо изменений в коде действительно сообщала о двойном вызове init с основным init в комментарии, а в drawscene - без комментариев ... Я очень запутался.

EDIT 2: 14: 45 29.08.2010

Хорошо, я кое-что нашел ....

Конструктор в drawscene вызывает методы initGlut и initRendering класса.Контроллер делает указатель на кучу, содержащую там объект drawScene, что заставляет методы запускать код инициализации.

Контроллер, однако, не включен в основной и не создан.Этот код drawScene запускается перед запуском основного, и могу ли я тогда заключить, что проблема заключается в самой сборке, поэтому мне следует избегать кода инициализации в конструкторах?

РЕДАКТИРОВАТЬ 3: 15:02 29/08/2010

Найден другой, двойной вызов происходит, когда только drawScene является активным кодом инициализации.Может ли быть так, что каждое включение drawscene приводит к тому, что код конструктора запускает код инициализации и вызывает двойную инициализацию?

Ответы [ 2 ]

1 голос
/ 29 августа 2010

Почему бы не прикрепить точку останова к вашему коду инициализации, а затем пройтись по стеку вызовов, чтобы увидеть, где он вызывается?

Пройдите по нему медленно, и я думаю, вы найдете источник ..

Редактирование: сохранение инициализации таких вещей, как библиотеки, вне конструктора является хорошей практикой.Лично я бы просто проверил, что перенасыщение было инициализировано в конструкторе, если это необходимо, и выбросил бы исключение, если оно не обнаружено.

0 голосов
/ 30 августа 2010

соответственно, эти изящные указатели были не частью объекта, а глобальными, GG C # VS C ++: P

Глобальное объявление вещи в файлах cpp BAD, урок

...