Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di Francis87
    Registrato dal
    Jun 2003
    Messaggi
    5,970

    [c++/qt4/opengl] segmentation fault

    Salve a tutti

    Ho un problema con widget openGL: ho un'applicazione in c++ e qt dove mi creo un widget openGL.

    Nel costruttore della classe che si occupa della gui chiamo:
    codice:
    MyGUI::MyGUI() : QMainWindow()
    {
        glField = new MyGLWidget;
    }
    glField è definito nel header come
    codice:
    MyGLWidget *glField;
    MyGLWidget è una classe derivata da QGLWidget:
    codice:
    #include <QtOpenGL/QGLWidget>
    #include <QWidget>
    
    class QWidget;
    
    class MyGLWidget : public QGLWidget
    {
        Q_OBJECT
        public:
            MyGLWidget();
            ~MyGLWidget();
    };
    La classe ha vari metodi che sono ora tutti commentati perchè non importanti per il problema.

    La compilazione va a buon fine, ma quando lancio il programma ottengo un segmentation fault alla creazione del MyGLWidget con new.

    L'errore riportato è:
    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread 0x2b3474ed70a0 (LWP 5100)]
    0x00002b3475683b6c in __glim_GetString () from /usr/lib/dri/fglrx_dri.so
    C'è speranza di risolverlo?

    Il compilatore è g++ 4.2.3 su Debian Linux.
    Heaven's closed. Hell sold out.

    Linux 2.6.26-2-amd64
    Debian squeeze

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Bisognerebbe vedere il codice del costruttore della MyGLWidget, ovvero il corpo della

    MyGLWidget();

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    ma segmentation fault che significa in effetti?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    E' l'equivalente windows dell'accesso in memoria quando questa non poteva essere read/write.

    Ovvero, e' il tentativo di accedere (in genere tramite un puntatore con un valore non corretto ...) ad un indirizzo di memoria non allocato al processo in cui sta girando quel codice ...

  5. #5
    Utente di HTML.it L'avatar di Francis87
    Registrato dal
    Jun 2003
    Messaggi
    5,970
    Originariamente inviato da oregon
    Bisognerebbe vedere il codice del costruttore della MyGLWidget, ovvero il corpo della

    MyGLWidget();
    non c'è nulla! :'(

    codice:
    MyGLWidget::MyGLWidget() : QGLWidget()
    {
        printf("mark 2\n");
    }
    Heaven's closed. Hell sold out.

    Linux 2.6.26-2-amd64
    Debian squeeze

  6. #6

  7. #7
    Ho visto la dichiarazione della classe QGLWidget http://doc.trolltech.com/3.3/qgl-h.html
    in cui si vede che il suo distruttore non è virtuale, il che generalmente significa che NON è derivabile.

    EDIT: curiosamente ho visto che nella documentazione si dice di "derivarla", non mi spiego quindi per quale oscuro motivo tale distruttore non sia virtuale.. ma ok non conosco di preciso le qgl.

  8. #8
    Utente di HTML.it L'avatar di Francis87
    Registrato dal
    Jun 2003
    Messaggi
    5,970
    mah.. mi basavo sugli esempi, come qua: http://doc.trolltech.com/4.3/opengl-...idget-cpp.html

    la versione di qt è la 4.3 non 3.3 cmq

    gdb mi ha riportato l'errore
    codice:
    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread 0x2b3474ed70a0 (LWP 5100)]
    0x00002b3475683b6c in __glim_GetString () from /usr/lib/dri/fglrx_dri.so
    l'esecuzione del programma dà solamente
    codice:
    Segmentation fault
    Heaven's closed. Hell sold out.

    Linux 2.6.26-2-amd64
    Debian squeeze

  9. #9
    Ho verificato che anche nella 4.3 il distruttore della QGLWidget NON è virtuale.
    Molto strambo per una classe che è stata creata per essere derivata. Non è formalmente un errore, praticamente obbliga lo sviluppatore ad istanziare direttamente la classe derivata, senza riferivisi attraverso la super classe.
    Insomma se la si utilizza come "GDerivata * aDerivata = new GDerivata;" non ci son problemi, ma se si fa "GBase * aBase = new GDerivata" allora sicuramente, il fatto che il distruttore di GBase non sia virtuale, implica che il suo distruttore non venga chiamato, con tutte le inevitabili conseguenze catastrofiche del caso. Ma ripeto non conosco le qgl.

    In ogni modo per il tuo problema, usa il debugger, ed al momento del crash, osservando lo stack delle chiamate, dovresti capire, dove sta il problema.

  10. #10
    Utente di HTML.it L'avatar di Francis87
    Registrato dal
    Jun 2003
    Messaggi
    5,970
    ho installato i pacchetti di debug per qt, ma gdb non mi dà alcuna informazione in aggiunta a quanto ho postato prima. C'è qualche flag particolare da impostare?

    utilizzo la classe come
    codice:
    MyGLWidget *glField; // in MyGUI.h
    glField = new MyGLWidget; // in MyGUI.cpp
    quindi dovrebbe andare... ma non va.
    Heaven's closed. Hell sold out.

    Linux 2.6.26-2-amd64
    Debian squeeze

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.