Probleme mit QVector

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Probleme mit QVector

Beitrag von dolin93 »

Hallo,
weil ein ähnliches Programm mit QList läuft, wollte ich mit QVector zwei eindimensionale Felder bzw. Vektoren in einer Klasse addieren. Leider gibt es die unten angegebenen Fehlermeldungen. Kann mir jemand mitteilen, was ich ändern muß?

Code: Alles auswählen

#include <QtCore/QCoreApplication>
#include "matdemo.h"
#include <iostream>
#include <QVector>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    double x[5]={1.1,2.2,3.3,4.4,5.5};
    double y[5]={2.2,4.4,6.6,8.8,11.0};
    QVector<double>v1(5);
    ;
    for(int i=0;i<5;i++)
    {v1.push_back(x[i]);
    }
    QVector<double> v2(5);
    for(int i=0;i<5;i++)
    {v2.push_back(y[i]);
    }
    MatDemo demo(v1,v2);
    QVector<double> result(5);
    demo.addiereVec(result);
    for(int i=0;i<5;i++)
    {
        std::cout<<"  "<<result[i];
   }
    return a.exec();
}

#ifndef MATDEMO_H        //Header-Datei
#define MATDEMO_H
#include <QVector>

class MatDemo
{
public:
    MatDemo(const double &v1, const double &v2);
    void addiereVec(double &result);
private:
    double p_in_v1;
    double p_in_v2;
};
#endif // MATDEMO_H

#include "matdemo.h"     //Quelldatei
#include <QObject>

MatDemo::MatDemo(const double &v1, const double &v2):p_in_v1(v1),p_in_v2(v2)
{
}
void MatDemo::addiereVec(double &result)
{for(int i=0;i<5;i++)
    {R[i]=p_in_v1[i]+p_in_v2[i];
        result.push_back(R[i]);
    }
}

Code: Alles auswählen

main.cpp:20: error: no matching function for call to ‘MatDemo::MatDemo(QVector<double>&, QVector<double>&)’
main.cpp:22: error: no matching function for call to ‘MatDemo::addiereVec(QVector<double>&)’
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Probleme mit QVector

Beitrag von Christian81 »

"const double &v1" ist eben nicht "QVector<double>"
const double & erwartet einen einzigen double-Wert der als Referenz übergeben wird und Du möchtest einen QVector<double> übergeben. Also pass Deinen Übergabeparameter an und fertig. Dann musst Du auch nicht hart die '5' codieren sondern kannst QVector::size() benutzen.
MfG Christian

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

Re: Probleme mit QVector

Beitrag von dolin93 »

Vielen Dank für Deine Antwort!
Wenn ich, wie von Dir empfohlen, const double &v1 durch QVector<double> &v1 ersetze und mit const double &v2 und double &result ähnlich verfahre, dann bleiben die Fehlermeldungen unverändert.
Mit der Vorgehensweise aus C:

Code: Alles auswählen

#include <QtCore/QCoreApplication>
#include <iostream>
#include <cmath>
#include "addition.h"
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    double A[4]={1.1, 2.2, 3.3, 4.4};
    double b[4]={5.5, 6.6, 7.7, 8.8};
    double* Zeiger=  Addition::Addieren(A,b);
    for(int i=0;i<4;i++)
    {cout<<"   "<<*(Zeiger+i)<<endl;
    }
    return a.exec();
}
#ifndef ADDITION_H
#define ADDITION_H

class Addition
{
public:
    //double u[4];
    Addition();
    static double* Addieren(double a1[],double a2[]);

};

#endif // ADDITION_H
#include <iostream>
#include <cmath>
#include "addition.h"
using namespace std;

double u[4];
double* Addition::Addieren(double a1[], double a2[])
{
    for(int i=0; i<4; i++)
    {u[i]=a1[i]+a2[i];
    }
    return &u[0];
}
gibt es da keine Probleme.
Wie man in C++ und in Qt elegant int- oder double-Werte übergibt, sieht man in allen einschlägigen Büchern immer wieder, aber wie man Vektoren etc. transportiert leider nicht.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Probleme mit QVector

Beitrag von Christian81 »

Und was für Fehlermeldungen kommen genau? Bzw. wie sieht Dein Code aus?
Wie man in C++ und in Qt elegant int- oder double-Werte übergibt, sieht man in allen einschlägigen Büchern immer wieder, aber wie man Vektoren etc. transportiert leider nicht.
Das liegt wohl daran dass dort das Verfahren haargenau das Gleiche ist...


btw: Bitte benutze die [

Code: Alles auswählen

]-Tags
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Probleme mit QVector

Beitrag von franzf »

Christian81 hat geschrieben:btw: Bitte benutze die [

Code: Alles auswählen

]-Tags[/quote]
Ich hab die einfach mal ganz frech eingefügt ;)

[quote="dolin93"]Wenn ich, wie von Dir empfohlen, const double &v1 durch QVector<double> &v1 ersetze und mit const double &v2 und double &result ähnlich verfahre, dann bleiben die Fehlermeldungen unverändert.[/quote]
Das bezweifle ich. Bitte poste IMMER den Code, der Probleme macht + die komplette Fehlermeldung. Eine Beschreibung abgeben ohne Code, und dann noch Code posten der funktioniert, aber ganz anders arbeitet, bringt leider gar nichts.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Probleme mit QVector

Beitrag von RHBaum »

Wie man in C++ und in Qt elegant int- oder double-Werte übergibt, sieht man in allen einschlägigen Büchern immer wieder, aber wie man Vektoren etc. transportiert leider nicht.
Naja !
1. fuer alle Typen expliziet wirst das nicht finden, weil sich wirklich nur der Typ aendert.
2. Im Stroustrup gibts ganz kurz was, ich glaub im Artikel zu referenzen
3. einige andere Literatur, effective c++, execpional c++, modern c++ usw behandeln das thema abstrakt auch, im zusammenhang mit lifecycles, threading probleme etc.

Also konkret dafuer artikel gibts nicht, was zu trivial ist, aber in zusammenhang mit komplexeren themen gibts da scho was !
Und generell den besten Weg gibts nicht, sondern der ist immer situational ! Manchmal kann die Kopie der einzig sichere Weg sein (multithreading z.b. )

Ciao ...
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Probleme mit QVector

Beitrag von dolin93 »

Vielen Dank für Eure Antworten!
Der Grund, warum nach der Änderung immer noch die Fehlermeldungen aufgetreten sind, ist anscheinend, daß ich QVector<double<v1(5) etc. geschrieben habe anstatt QVector<double<v1 etc.. Mittlerweilen läuft das folgende Programm, worüber ich sehr froh bin.

Code: Alles auswählen

#include <QtCore/QCoreApplication>
#include "matdemo.h"
#include <iostream>
#include <QVector>

    int main(int argc, char *argv[])
{   typedef QVector<double> vec;
    QCoreApplication a(argc, argv);
    double x[5]={1.1,2.2,3.3,4.4,5.5};
    double y[5]={2.2,4.4,6.6,8.8,11.0};
    QVector<double>v1;
    ;
    for(int i=0;i<5;i++)
    {v1.push_back(x[i]);
    }
    vec v3;
    v3.push_back(9.99);
    QVector<double> v2;
    for(int i=0;i<5;i++)
    {v2.push_back(y[i]);
     v3.push_back(y[i]);
        std::cout<<"  i="<<i<<"   v1="<<v1[i]<<"  x[i]="<<x[i]<<"   v3="<<v3[i]<<std::endl;

    }
    MatDemo demo(v1,v2);
    QVector<double> result;
    demo.addiereVec(result);
    for(int i=0;i<5;i++)
    {
        std::cout<<"  result[i]="<<result[i]<<std::endl;
   }


    return a.exec();
}
#ifndef MATDEMO_H
#define MATDEMO_H
#include <QVector>

class MatDemo
{
public:
    MatDemo(const QVector<double> &v1, const QVector<double> &v2);
    void addiereVec(QVector<double> &result);
private:
   QVector<double>_v1;
   QVector<double>_v2;
};

#endif // MATDEMO_H
#include "matdemo.h"
#include <QObject>
#include <iostream>

MatDemo::MatDemo(const QVector<double> &v1, const QVector<double> &v2) : _v1(v1), _v2(v2)
{
}
void MatDemo::addiereVec(QVector<double> &result)
{for(int i=0;i<5;i++)
    {
        result.push_back(_v1[i]+_v2[i]);
        std::cout<<"  result[i]="<<result[i]<<"   _v1[i]="<<_v1[i]<<std::endl;
    }
}

[/quote]
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Probleme mit QVector

Beitrag von Christian81 »

Jetzt mach aus "i < 5" noch ein "i < v1.size() && i < v2.size()" und es crasht auch nicht wenn weniger als 5 Elemente in den Vektoren sind.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten