|
|
|
|
Bonjour,
voila, j'ai un programme fait avec QT 3.0 qui fonctionne très bien.
Pour ma fenêtre principale, j'ai une class :
clas Form2 : public QMainWindow
{
...
QAction* action1;
...}
Maintenant, j'ai besoin de mettre une action supplémentaire, donc je rajoute :
clas Form2 : public QMainWindow
{
...
QAction* action1;
QAction* action2;
...}
Et là : erreur de segmentation à l'exécution.
Pour testé, je commente tout ce qui concerne action1, je recompile et là aucun problème !
action1 fonctionne sans action2, et action2 fonctionne sans action1, mais pas les deux ensemble.
J'ai l'impression que c'est comme si la class ne pouvait pas contenir plus d'un certain nombre de membre. En tout cas pour l'instant, je ne vois pas d'autre explication.
dans le .cpp, je fait des new QAction qui passent sans problème, donc ça ne viens pas de là.
Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char SnipeurConfiguration: Windows XP
Firefox 2.0.0.13
Compile ton programme avec l'option -g, puis lance le programme via le debugger (par exemple gdb). Lance le programme :
r param1 param2 param3.... Quand le segmentation fault se déclenche tape : bt Comme ça tu sauras exactement où a lieu l'erreur. De toute façon sans le code on ne peut pas t'aider... Quelques astuces : - préférer les références aux pointeurs : même efficacité, plus agréables syntaxiquement parlant, et contrairement à un pointeur, toujours initialisé - quand tu insères une donnée dans un container (genre std::vector) tu peux utiliser la méthode at( ) au lieu de [ ] qui est plus lent mais qui contrôle que tu es toujours dans le vector. - place des assert pour contrôler que les données sont cohérentes (header <cassert>). Par exemple : assert(!tableau.empty()); Bonne chance |
Merci de la réponse, mais ça ne viens pas de là, ou alors trop bizarrement...
#0 in ?? ... #1 in QScrollDataview::... from libqt-mt.so ... Bref, je sais pas d'où ça viens. Je mettrais les infos complete, et peut être le code lundi. Bon week'end Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ Char Snipeur |
Il faut que tu nettoyes tes fichiers .o et que tu les recompiles avec l'option -g si ce n'est pas le cas, car tu devrais au moins avoir la ligne du main correspondante (et toutes les fonctions en cours d'appel). Sinon gdb ne peut pas trop t'aider. Si la segfault se déclenche dans libqt-mt.so c'est probablement que tu lui passes des paramètres incohérents (pointeurs incompatibles ou pas initialisés, valeurs incohérentes etc...).
|
Je sais tout ça. Voici ce que donne gdb, et qui ne m'avance pas trop :
#0 0x00000011 in ?? ()
#1 0xb72ccf3d in QScrollViewData::QScrollViewData(QScrollView*, int) ()
from /usr/lib/qt-3.1/lib/libqt-mt.so.3
#2 0xb72c7494 in QScrollView::QScrollView(QWidget*, char const*, unsigned) ()
from /usr/lib/qt-3.1/lib/libqt-mt.so.3
#3 0xb7305f55 in QTextEdit::QTextEdit(QWidget*, char const*) ()
from /usr/lib/qt-3.1/lib/libqt-mt.so.3
#4 0x0805ad0d in Form2 (this=0xbfff9c30, parent=0xbfff9d80,
name=0x80fb920 "èç[·\002", fl=3221200256) at .ui/form2.cpp:114
#5 0x08050d36 in main (argc=1, argv=0x80fb630) at main.cpp:13
Voici une partie du .h : class Form2 : public QMainWindow
{
Q_OBJECT
public:
Form2( QWidget* parent = 0, const char* name = 0, WFlags fl = WType_TopLevel );
~Form2();
QLabel* textLabel2;
QLabel* textLabel1;
QLabel* textLabel3;
QLineEdit* lineEdit5;
QLineEdit* lineEdit6;
QLineEdit* lineEdit7;
QCheckBox* checkRich;
QTabWidget* tabWidget2;
QWidget* tab;
QTextEdit* textEdit1;
QWidget* tab_2;
QTextEdit* textEdit2;
QWidget* tab_3;
QTextEdit* textEdit3;
QPushButton* STOP_button;
QMenuBar *menubar;
QPopupMenu *fileMenu;
QPopupMenu *editMenu;
QPopupMenu *PopupMenu;
QPopupMenu *helpMenu;
QToolBar *toolBar;
QToolBar *Toolbar;
QToolBar *Toolbar_2;
QToolBar *Toolbar_3;
QAction* fileNewAction;
QAction* fileOpenAction;
QAction* fileSaveAction;
QAction* fileSaveAsAction;
QAction* fileExitAction;
QAction* editUndoAction;
QAction* editRedoAction;
QAction* editCutAction;
QAction* editCopyAction;
QAction* editPasteAction;
QAction* editFindAction;
QAction* helpContentsAction;
QAction* helpIndexAction;
QAction* helpAboutAction;
QAction* MC3D;
QAction* Lancement;
QAction* resu;
QAction* configPATH;
QAction* MultiCalc;
QAction* LanceMulti;
QAction* Plot;
QAction* fort77;
QAction* VisIt;
QAction* Export;
QAction* ExportSh;
QAction* Couleurs;
QAction* ActionTest;
...
Le simple ajout de ActionTest dans le .h suffit à générer l'erreur. Par contre, si je commente une autre QAction (ainsi que ses différents appels dans les .cpp) l'erreur disparaît. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ Char Snipeur |
#4 0x0805ad0d in Form2 (this=0xbfff9c30, parent=0xbfff9d80,
name=0x80fb920 "èç[·\002", fl=3221200256) at .ui/form2.cpp:114
#5 0x08050d36 in main (argc=1, argv=0x80fb630) at main.cpp:13
Bah il faut voir ce que tu as écris dans ui/form2.cpp à la ligne 114. QUe veux tu que je fasse d'un .hpp incomplet :-) Bonne chance |
???
|
Bah quand tu as une seg fault la première à chose à faire c'est de recompiler complètement le programme. Si la seg fault persiste c'est qu'il y a une erreur et tu compiles en -g, puis tu lances le débuggueur. Une seg fault peut se déclarer après "l'erreur" si par chance cette erreur restait dans une zone mémoire que ton programme utilisait.
|