Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/04/2010, à 10:43

arnaud_d

[Résolu] [C++,Qt,Qwt] Tracer un graph avec QwtPlot

Bonjour,

Je viens vous demander de l'aide car ça fait deux jours que j'essaie de tracer un graphique avec QwtPlot (librairie Qwt) mais je n'y arrive pas, je me tape des segfault tout le temps.

J'ai réalisé une interface utilisateur avec QtDesign dans laquelle il y a un QwtPlot widget, voici le passage du fichier .ui correspondant :

        verticalLayout_8 = new QVBoxLayout();
        verticalLayout_8->setObjectName(QString::fromUtf8("verticalLayout_8"));

        deflectionGraph = new QwtPlot(groupBox_6);
        deflectionGraph->setObjectName(QString::fromUtf8("deflectionGraph"));

        verticalLayout_8->addWidget(deflectionGraph);

Dans mon programme j'ai mes données x et y sous forme de std::vector. Malheureusement Qwt ne connait pas les std::vector, je suis donc obligé de passer par des tableaux normaux, voici comment j'ai fait (dans un fichier cpp distinct, dédié aux calculs) :

#include <qwt_plot.h>
#include <qwt_plot_curve.h>

void MaFenetre::MaFonction()
{
[... beaucoup de code ici ..]

  QwtPlotCurve *def0 = new QwtPlotCurve("Def0");

  double *r_array=NULL;
  r_array = new double(r.size());
  double *deflection_array=NULL;
  deflection_array = new double(deflection.size());

  memcpy( r_array, &r[0], sizeof( double ) * r.size() );
  qDebug() << "r copié";
  memcpy( deflection_array, &deflection[0], sizeof( double ) * deflection.size() );
  qDebug() << "deflection copié";

NB: r correspond aux abscisses de mes points ("x"), et deflection aux ordonnées ("y")

Pour l'instant tout va bien, j'ai mes messages de debug...

Puis :

  QwtArrayData data(r_array,deflection_array, sizeof(r_array) / sizeof(double));
  qDebug() << "QwtArrayData créé";
  def0->setData(data);
  qDebug() << "setData";
  def0->attach(deflectionGraph);
  qDebug() << "attach";

et là plantage, voici ce que me dit gdb (que je découvre)

r copié 
deflection copié 
QwtArrayData créé 

Program received signal SIGSEGV, Segmentation fault.
0x003b26ce in QwtPlotCurve::setData(QwtData const&) ()
   from /usr/lib/libqwt-qt4.so.5

Alors là j'ai cru lire que un trace pourait aidé les pros :

(gdb) backtrace
#0  0x003b26ce in QwtPlotCurve::setData(QwtData const&) ()
   from /usr/lib/libqwt-qt4.so.5
#1  0x080508f6 in MicDisto::staticCalculation() ()
#2  0x08059d86 in MicDisto::qt_metacall(QMetaObject::Call, int, void**) ()
#3  0x00f01263 in QMetaObject::activate(QObject*, int, int, void**) ()
   from /usr/lib/libQtCore.so.4
#4  0x00f016d8 in QMetaObject::activate(QObject*, QMetaObject const*, int, int, void**) () from /usr/lib/libQtCore.so.4
#5  0x00bbbcc1 in QAbstractButton::clicked(bool) () from /usr/lib/libQtGui.so.4
#6  0x008e4549 in ?? () from /usr/lib/libQtGui.so.4
#7  0x008e61a4 in ?? () from /usr/lib/libQtGui.so.4
#8  0x008e6431 in QAbstractButton::mouseReleaseEvent(QMouseEvent*) ()
   from /usr/lib/libQtGui.so.4
#9  0x00584012 in QWidget::event(QEvent*) () from /usr/lib/libQtGui.so.4
#10 0x008e43ee in QAbstractButton::event(QEvent*) ()
   from /usr/lib/libQtGui.so.4
#11 0x0098e66d in QPushButton::event(QEvent*) () from /usr/lib/libQtGui.so.4
#12 0x0052ef54 in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
   from /usr/lib/libQtGui.so.4
#13 0x00537033 in QApplication::notify(QObject*, QEvent*) ()
   from /usr/lib/libQtGui.so.4
#14 0x00eeb6cb in QCoreApplication::notifyInternal(QObject*, QEvent*) ()
   from /usr/lib/libQtCore.so.4
#15 0x00535f6e in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&) () from /usr/lib/libQtGui.so.4
#16 0x005a47c0 in ?? () from /usr/lib/libQtGui.so.4
#17 0x005a3c4b in QApplication::x11ProcessEvent(_XEvent*) ()
   from /usr/lib/libQtGui.so.4
#18 0x005d0502 in ?? () from /usr/lib/libQtGui.so.4
#19 0x01438648 in g_main_context_dispatch () from /lib/libglib-2.0.so.0
#20 0x0143bea3 in ?? () from /lib/libglib-2.0.so.0
#21 0x0143c028 in g_main_context_iteration () from /lib/libglib-2.0.so.0
#22 0x00f1602c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
#23 0x005cfbe5 in ?? () from /usr/lib/libQtGui.so.4
#24 0x00ee9c79 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
#25 0x00eea0ca in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()
   from /usr/lib/libQtCore.so.4
#26 0x00eec53f in QCoreApplication::exec() () from /usr/lib/libQtCore.so.4
#27 0x0052edd7 in QApplication::exec() () from /usr/lib/libQtGui.so.4
#28 0x0804ce3d in main ()

... ce qui est bien évidemment incompréensible, enfin pour moi ^^

Est-ce que quelqu'un a une idée ?

Juste pour info, si je m'ammuse à remplacer la transformation de std::vector en tableau par :

  double r_array[] = {100, 200, 300};
  double deflection_array[] = {300,400,200};

tout marche sans problème.

J'ajoute également que la suite de mon programme est :

deflectionGraph->replot();
qDebug() << "replot";

mais je viens de m'apercevoir en écrivant ce billet que ce n'est pas nécessaire, il rafraichit le graph automatiquement.

Merci à tous ceux qui m'ont suivi et qui accepteront de m'aider smile

Arnaud

Dernière modification par arnaud_d (Le 16/04/2010, à 13:21)

Hors ligne

#2 Le 16/04/2010, à 12:35

obiwankennedy

Re : [Résolu] [C++,Qt,Qwt] Tracer un graph avec QwtPlot

C'est peut-être équivalent mais en général on utilise [] pour alouer un tableau :
je remplacerai ça

r_array = new double(r.size());

par ça:

r_array = new double[r.size()];

Sinon je pense que ton problème c'est :

QwtArrayData data(r_array,deflection_array, sizeof(r_array) / sizeof(double));

je ne suis pas sur que sizeof(r_array) te renvoi un truc cohérent. Il doit normalement te retourne la taille d'une adresse, qui est probablement plus petit que ton tableau. Pourquoi ne pas réutiliser r.size() ?


Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam

Hors ligne

#3 Le 16/04/2010, à 13:21

arnaud_d

Re : [Résolu] [C++,Qt,Qwt] Tracer un graph avec QwtPlot

Bonjour obiwankennedy,

Tu as tout à fait raison le problème était du aux parenthèses, c'est vrai que memcpy rien ne l'arrête si ce n'est la taille qu'on lui donne en argument. Je crois que je débordais bien, je suis même étonné que ça passait à l'écriture (au niveau du memcpy).

Arf, à chaque fois que je galère c'est sur un problème de syntaxe !

Merci mille fois. En ce qui concerne

sizeof(r_array) / sizeof(double)

j'avais utilisé ça parce qu'il me reprochait de ne pas lui donner un size_t avec la méthode de std::vector mais en fait ça marche maintenant, va savoir...

MERCI !!!

Hors ligne