Absturz nach Programmerweiterung

Alles rund um die Programmierung mit Qt
Antworten
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Absturz nach Programmerweiterung

Beitrag von dolin93 »

Hallo,
wenn ich in ein funktionierendes Programm noch

Code: Alles auswählen

 int IntP,Gr_PFE;
            m=5.0;
            n=10.0;
            float KFQ=1000.0;   //KFQ=KF*KF
            float f1=(m-2.0)/(m+1.0);
            float f2=2.0/(m+1.0);
            for (int t=Vecg-10;t>-1;t--)
            {N[t]=0;
                Z[t]=sqrt((Close[t]-Close[t-n+1])*(Close[t]-Close[t-n+1])/KFQ+n*n);
                if(Close[t]-Close[t-n+1]<0)
                {Z[t]=-Z[t];}

                for(int i=0;i<n-1;i++)
                {N[t]+=sqrt((Close[t-i]-Close[t-i-1])*(Close[t-i]-Close[t-i-1])/KFQ+1);
                }
                //std::cout<<"  Z="<<Z[t]<<"  N[t]="<<N[t]<<std::endl;
                if(t==Vecg-10)
                {IntP=int(Z[Vecg-10]*100.0/N[Vecg-10]);
                    PFE.append(IntP);
                }else{
                 IntP=int(f1*PFE[Vecg-11-t]+f2*100.0*Z[t]/N[t]);
                 PFE.append(IntP);
                }
                Gr_PFE=PFE.size();
                std::cout<<"  t="<<t<<"  PFE["<<Vecg-10-t<<"]="<<PFE[Vecg-10-t]<<" Z="<<Z[t]<<"  N="<<N[t]<<" f1="<<f1<<" f2="<<f2<<" Gr.v.PFE="<<Gr_PFE<<std::endl;
            }
einfüge und PFE[t] noch in

Code: Alles auswählen

void mainWidget::paintEvent ( QPaintEvent * event )
mittels

Code: Alles auswählen

    PFE_gr=PFE.size();
     QString PFE_Str1=german.toString(PFE_gr);
    qDebug("Dimension von PFE_gr22222222222=");
    qDebug(qPrintable(PFE_Str1));
    painter.setPen( QPen(Qt::magenta, 1) );
    for(int i=0;i<PFE_gr-2;i++)   //      Vecg-11;i>0;i--)
    {ku=int(250-PFE[i]);
     ku1=int(250-PFE[i+1]);
        u=8*i;
        x1=8*i+8;
     painter.drawLine(u,ku,x1,ku1);
    }
graphisch darstellen will, so stürzt das Programm ab. Die Ausgabe gemäß

Code: Alles auswählen

 std::cout<<"  t="<<t<<"  PFE["<<Vecg-10-t<<"]="<<PFE[Vecg-10-t]<<" Z="<<Z[t]<<"  N="<<N[t]<<" f1="<<f1<<" f2="<<f2<<" Gr.v.PFE="<<Gr_PFE<<std::endl;
geschieht manchmal für alle t und manchmal für weniger, was meiner Meinung nach an der Verwendung von QThread liegt. Der Programmabsturz erfolgt auch wenn die graphische Darstellung der PFE[t] ausgeschaltet wird. Ich hätte die beiden Programme, d.h. das funktionierende und das abstürzende gerne in komprimierter Form angehängt, aber leider hieß es
Das Kontingent für Dateianhänge ist bereits vollständig ausgenutzt.
.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Absturz nach Programmerweiterung

Beitrag von Christian81 »

Zu wenig Informationen - Du redest z.B. von QThread aber ich sehe nirgends die Verwendung. Auch wird der Programmaufbau nirgends beschrieben. --> minimales, kompilierbares Beispiel welches das Problem aufzeigt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Absturz nach Programmerweiterung

Beitrag von dolin93 »

Vielen Dank für Deine Antwort!
Am einfachsten wäre es, wenn ich das funktionierende und das auf die beschriebene Weise erweiterte und abstürzende Programm jeweils als zip-Datei anhängen könnte. Beide Programme (jeweils 2 Header- und 3 Source-Files) oder nur das erweiterte in dieses Feld zu posten, wäre wohl weniger sinnvoll. Ich verstehe nicht, warum es heißt, daß das Kontingent für Dateianhänge bereits vollständig ausgenutzt ist, obwohl ich gar nichts anhängen konnte. Der Programmabsturz hängt meines Erachtens mit QThread zusammen und wird nicht leicht zu vermeiden sein.. Ohne die Verwendung von QThread habe ich aber das funktionierende Programm nicht zum Laufen gebracht. Die Quelldateien lauten

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwidget.h"
#include <QtCore/QCoreApplication>
#include <iostream>
#include <iomanip>
#include <QtNetwork>
#include <QHttp>
#include "filedownloader.h"
#include <QString>
#include <QApplication>
#include <QObject>
using namespace std;

int main(int argc, char *argv[])
{
    QApplication a( argc, argv );
    char separator, step='d',tags;
    QString symbol="^GDAXI";
    int startDay=20,startMonth=6,startYear=2014,endDay=31, endMonth=12,endYear=2014,sM,eM;
    sM=startMonth-1;
    eM=endMonth-1;
    QUrl histUrl(QString("http://ichart.finance.yahoo.com/table.csv?s=%1&a=%2&b=%3&c=%4&d=%5&e=%6&f=%7&g=step&y=0&ignore=.cvs").arg(symbol).arg(sM).arg(startDay).arg(startYear).arg(eM).arg(endDay).arg(endYear),QUrl::TolerantMode);
   // FileDownloader demo(histUrl);
    FileDownloader *demo = new FileDownloader(histUrl);
    mainWidget w;
     qDebug("11111111111mmmmmmmmmmmmmmmmmmmmmmm");
    QObject::connect(demo,SIGNAL(DataA(const QByteArray&)),&w,
                     SLOT(Receiver(const QByteArray &)));    
     qDebug("22222222222222mmmmmmmmmmmmmmmmmmm");
     demo->start();
    w.show();
     qDebug("zzzzzzzzzzzzzzzzzzzzz");
    return a.exec();
}

Code: Alles auswählen

#include "filedownloader.h"
#include <iostream>
#include <QtDebug>
#include "mainwidget.h"
FileDownloader::FileDownloader(const QUrl &KUrl ) : kUrl(KUrl),QThread()
   {qDebug("FFFFFFFFFFFFFFFFFFFFFF111111111111111111111");
       connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)),
                   SLOT(fileDownloaded(QNetworkReply*)));
       QNetworkRequest request(kUrl);
       m_WebCtrl.get(request);
      qDebug("FFFFFFFFFFFFFFFFFFFFFF222222222222222222");
   }

   FileDownloader::~FileDownloader()
   {

   }

   void FileDownloader::fileDownloaded(QNetworkReply* pReply)
   {qDebug("FFFFFFFFFFFFFFFFFFFFFF33333333333333333333333333");
       m_DownloadedData = pReply->readAll();
       pReply->deleteLater();
       emit downloaded();
       //for(int i=0;i<10;i++){
       emit DataA(m_DownloadedData);
      // sleep(1);
       //}
       qDebug("FFFFFFFFFFFFFFFFFFFFFF4444444444444444444444444");

       return ;
   }
und

Code: Alles auswählen

#include "mainwidget.h"
#include <QtGui>
#include <QVector>
#include <cmath>
#include <QtDebug>
#include <iostream>
#include <QString>
#include <QLocale>
mainWidget::mainWidget()
{
    setWindowTitle ( "paintEvent - Demo");
    resize( 1000, 400 );
    qDebug("11111111111wwwwwwwwwwwwwwwwwwwwwww");
}
void mainWidget::paintEvent ( QPaintEvent * event ) {
   QPainter painter(this);
   qDebug("2222222222222222222wwwwwwwwwwwwwwwwwwwwww");
   painter.begin( this );
   painter.setPen( QPen(Qt::blue, 2) );
    painter.drawLine(0,300,1000,300);
   int u,x1,ku=40,ku1=40,Vo=140,Vo1=140,AK=9500;
   float Mult=0.7;  //Ak sei ungefährer Kurs
   qDebug("333333333333333wwwwwwwwwwwwwwwwwwwwww");
   sleep(4);
   Vecg=Volume.size()-2;
   Groesse_CloseAdj=CloseAdj.size();
   //PFE_gr=PFE.size();
   QLocale german(QLocale::German, QLocale::Germany);
   QString Vect_Str = german.toString(Vecg);
   QString VectCloseAdj_Str = german.toString(Groesse_CloseAdj);
   //QString PFE_Str=german.toString(PFE_gr);
   qDebug("Dimension von Vecg=");
   qDebug(qPrintable(Vect_Str));
   qDebug("Dimension von Groesse_CloseAdj=");
   qDebug(qPrintable(VectCloseAdj_Str));
   //qDebug("Dimension von PFE_gr=");
   //qDebug(qPrintable(PFE_Str));
   for(int i=1;i<Vecg;i++)
   {   u=i*8;
       x1=8+8*i;
       ku=300-(Close[Vecg-i]-AK)*Mult;
       ku1=300-(Close[Vecg-i-1]-AK)*Mult;
       painter.drawLine(u,ku,x1,ku1);
   }

   if(1>0)                               //Wenn 1>0 gesetzt wird, werden Open-Close,High-Close  etc auch gezeichnet.
   {  painter.setPen( QPen(Qt::magenta, 1) );
   for(int i=1;i<Vecg;i++)
   {   u=i*8;
       x1=8+8*i;
       ku=300-(CloseAdj[Vecg-i]-Close[Vecg-i])*Mult;
       ku1=300-(CloseAdj[Vecg-i-1]-Close[Vecg-i-1])*Mult;
       //painter.drawLine(u,ku,x1,ku1);              //Ändern ??????????????????? Benötigt???????????
   }
    painter.setPen( QPen(Qt::blue, 2) );
   for(int i=1;i<Vecg;i++)
   {   u=i*8;
       x1=8+8*i;
       ku=300-(Close[Vecg-i]-AK)*Mult;
       ku1=300-(Close[Vecg-i-1]-AK)*Mult;

       painter.drawLine(u,ku,x1,ku1);
   }
   painter.setPen( QPen(Qt::yellow, 1) );
  for(int i=1;i<Vecg;i++)
  {   u=i*8;
      x1=8+8*i;
      ku=300-(High[Vecg-i]-Close[Vecg-i])*Mult;
      ku1=300-(High[Vecg-i-1]-Close[Vecg-i-1])*Mult;
      painter.drawLine(u,ku,x1,ku1);
  }
  painter.setPen( QPen(Qt::black, 1) );
 for(int i=1;i<Vecg;i++)
 {   u=i*8;
     x1=8+8*i;
     ku=300-(Low[Vecg-i]-Close[Vecg-i])*Mult;
     ku1=300-(Low[Vecg-i-1]-Close[Vecg-i-1])*Mult;
     painter.drawLine(u,ku,x1,ku1);
 }
 painter.setPen( QPen(Qt::green, 1) );
for(int i=1;i<Vecg;i++)
{   u=i*8;
    x1=8+8*i;
    ku=300-(Open[Vecg-i]-Close[Vecg-i])*Mult;
    ku1=300-(Open[Vecg-i-1]-Close[Vecg-i-1])*Mult;
    painter.drawLine(u,ku,x1,ku1);
}
   }
    qDebug("444444444444444444wwwwwwwwwwwwwwwwwwwwww");
    painter.setPen( QPen(Qt::red, 1) );
    for(int i=1;i<Vecg;i++)
   {   u=i*8;
       x1=8+8*i;
       Vo=Volume[Vecg-i]/1000000;
       Vo1=Volume[Vecg-i-1]/1000000;
       painter.drawLine(u,Vo,x1,Vo1);
   }
    //sleep(6);
     PFE_gr=PFE.size();
     QString PFE_Str1=german.toString(PFE_gr);
    qDebug("Dimension von PFE_gr22222222222=");
    qDebug(qPrintable(PFE_Str1));
    painter.setPen( QPen(Qt::magenta, 1) );
    for(int i=0;i<PFE_gr-2;i++)   //      Vecg-11;i>0;i--)
    {ku=int(250-PFE[i]);
     ku1=int(250-PFE[i+1]);
        u=8*i;
        x1=8*i+8;
     painter.drawLine(u,ku,x1,ku1);
    }
    painter.setPen(
   QPen(Qt::black, 5, Qt::DotLine, Qt::RoundCap));
   painter.drawRect( Koordinate,40,120,150 );
}
void mainWidget::Receiver(const QByteArray &QBA){
    qDebug(QBA);
    //std::cout<<"Fuer die Glaettung von PFE m=?  n=?"<<std::endl;
    //std::cin>>m,n;
    qDebug("Receiver     Receiver    Receiver    Receiver ");  
    groesseQBA=QBA.size();
    if(groesseQBA>40){
     qDebug("Receiver1     Receiver1    Receiver1    Receiver1 ");
     int j=0;
           while(QBA[j]!='2')
           {j++;
           }
           QVector<QString> days;           
           for(int i=j;i<=groesseQBA;i++)
           {QString day =" ";
           QString volume = " ";
           QString CloseAd =" ";
           QString open = "";
           QString high = "";
           QString low ="";
           QString close ="";
           qint32 volume_=0;
           float CloseA=0.0,Clos=0.0,Lo=0.0,Hig=0.0,Ope=0.0;
           for (int k=0;k<10;k++)
           {day+=QBA[i+k];
           }
           i+=9;
           while(QBA[i]!=',')
           {//qDebug(" Problem   bis Komma ");
            i++;
           }
           while(QBA[i+1]!=',')
           {open+=QBA[i+1];
            i++;}
           while(QBA[i+2]!=',')
           {high+=QBA[i+2];
            i++;}
           while(QBA[i+3]!=',')
            {low+=QBA[i+3];
               i++;}
           while(QBA[i+4]!=',')
            {close+=QBA[i+4];
               i++;}
           while(QBA[i+5]!=',')
            {volume+=QBA[i+5];
             i++;
            }
           while(((QBA[i+6]>='0' && QBA[i+6]<='9') || QBA[i+6]== '.')&& !(QBA[i+6]=='2' && QBA[i+7]=='0' && QBA[i+8]<='1' && QBA[i+9]<='5'))
           {CloseAd+=QBA[i+6];
           i++;
           //qDebug(qPrintable(CloseAd));
           }
           i+=6;
           CloseA=CloseAd.toFloat();
           Clos=close.toFloat();
           Lo=low.toFloat();
           Hig=high.toFloat();
           Ope=open.toFloat();
           //std::cout<<"CloseA="<<CloseA<<std::endl;
           days.append(day);
           CloseAdj.append(CloseA);
           Close.append(Clos);
           High.append(Hig);
           Open.append(Ope);
           Low.append(Lo);

           volume_=volume.toInt();
           Volume.append(volume_);
           }
           Vecg=1;
           Vecg=Volume.size();
            std::cout<<"!!!!!!!!!!!!!!!Vecg="<<Vecg<<"GroesseQBA="<<groesseQBA<<std::endl;
            for(int l=0;l<10;l++)
            {QString tag=days[l];
                qDebug(qPrintable(tag));
               // float Cl_Pr=CloseAdj[l];
              //std::cout<<Cl_Pr<<std::endl;
            }
            int IntP,Gr_PFE;                 //Diesen Teil habe ich neu hinzugefügt!
            m=5.0;
            n=10.0;
            float KFQ=1000.0;   //KFQ=KF*KF
            float f1=(m-2.0)/(m+1.0);
            float f2=2.0/(m+1.0);
            for (int t=Vecg-10;t>-1;t--)
            {N[t]=0;
                Z[t]=sqrt((Close[t]-Close[t-n+1])*(Close[t]-Close[t-n+1])/KFQ+n*n);
                if(Close[t]-Close[t-n+1]<0)
                {Z[t]=-Z[t];}

                for(int i=0;i<n-1;i++)
                {N[t]+=sqrt((Close[t-i]-Close[t-i-1])*(Close[t-i]-Close[t-i-1])/KFQ+1);
                }
                //std::cout<<"  Z="<<Z[t]<<"  N[t]="<<N[t]<<std::endl;
                if(t==Vecg-10)
                {IntP=int(Z[Vecg-10]*100.0/N[Vecg-10]);
                    PFE.append(IntP);
                }else{
                 IntP=int(f1*PFE[Vecg-11-t]+f2*100.0*Z[t]/N[t]);
                 PFE.append(IntP);
                }
                Gr_PFE=PFE.size();
                std::cout<<"  t="<<t<<"  PFE["<<Vecg-10-t<<"]="<<PFE[Vecg-10-t]<<" Z="<<Z[t]<<"  N="<<N[t]<<" f1="<<f1<<" f2="<<f2<<" Gr.v.PFE="<<Gr_PFE<<std::endl;
            }

     }
    Koordinate=160;
    return;
}
Vor dem Hinzufügen von

Code: Alles auswählen

 int IntP,Gr_PFE;
            m=5.0;
            n=10.0;
            float KFQ=1000.0;   //KFQ=KF*KF
            float f1=(m-2.0)/(m+1.0);
            float f2=2.0/(m+1.0);
            for (int t=Vecg-10;t>-1;t--)
            {N[t]=0;
                Z[t]=sqrt((Close[t]-Close[t-n+1])*(Close[t]-Close[t-n+1])/KFQ+n*n);
                if(Close[t]-Close[t-n+1]<0)
                {Z[t]=-Z[t];}

                for(int i=0;i<n-1;i++)
                {N[t]+=sqrt((Close[t-i]-Close[t-i-1])*(Close[t-i]-Close[t-i-1])/KFQ+1);
                }
                //std::cout<<"  Z="<<Z[t]<<"  N[t]="<<N[t]<<std::endl;
                if(t==Vecg-10)
                {IntP=int(Z[Vecg-10]*100.0/N[Vecg-10]);
                    PFE.append(IntP);
                }else{
                 IntP=int(f1*PFE[Vecg-11-t]+f2*100.0*Z[t]/N[t]);
                 PFE.append(IntP);
                }
                Gr_PFE=PFE.size();
                std::cout<<"  t="<<t<<"  PFE["<<Vecg-10-t<<"]="<<PFE[Vecg-10-t]<<" Z="<<Z[t]<<"  N="<<N[t]<<" f1="<<f1<<" f2="<<f2<<" Gr.v.PFE="<<Gr_PFE<<std::endl;
            }
und

Code: Alles auswählen

 PFE_gr=PFE.size();
     QString PFE_Str1=german.toString(PFE_gr);
    qDebug("Dimension von PFE_gr22222222222=");
    qDebug(qPrintable(PFE_Str1));
    painter.setPen( QPen(Qt::magenta, 1) );
    for(int i=0;i<PFE_gr-2;i++)   //      Vecg-11;i>0;i--)
    {ku=int(250-PFE[i]);
     ku1=int(250-PFE[i+1]);
        u=8*i;
        x1=8*i+8;
     painter.drawLine(u,ku,x1,ku1);
    }
ist (wie schon oben erwähnt) das Programm gelaufen ohne abzustürzen. Die Headerdatei mit QThread lautet

Code: Alles auswählen

#ifndef FILEDOWNLOADER_H
#define FILEDOWNLOADER_H
#include <QtCore/QCoreApplication>
#include <QObject>
#include <QByteArray>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QList>
#include <QVector>
#include <cmath>
#include <QThread>
class FileDownloader  : public QThread
{
    Q_OBJECT
public:
     FileDownloader(const QUrl &KUrl);
    virtual ~FileDownloader();

signals:
        void downloaded();
        void DataA(const QByteArray &m_DownloadedData);
        void downloadFinished(const QByteArray &data);
// private slots:
public slots:
    void fileDownloaded(QNetworkReply* pReply);
private:
    QUrl kUrl;
    QNetworkAccessManager m_WebCtrl;
    QByteArray m_DownloadedData;

};
#endif // FILEDOWNLOADER_H
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Absturz nach Programmerweiterung

Beitrag von Christian81 »

Da QNetworkAccessManager eh asynchron arbeitet, ist der Thread absolut unnötig - zumal du nur von QThread ableitest aber sonst nichts mit Threads machst, also auch kein neuer Thread erzeugt wird.
Und warum es crasht - ich schätze da ist ein Zugriff auf ein Array-Index der größer ist als das Array - es gibt nirgends checks ob z.B. das Z-Array (ist es überhaupt eines, ich sehe nirgends die Deklaration gesehen) groß genug ist.

btw: Die Variablenbezeichnung ist auch recht kryptisch und der Code sehr unübersichtlich. Das Ganze Zeichnen im jeden PaintEvent - Aufruf ist auch nicht gerade performant.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten