Seite 1 von 1
[gelöst] QStringList in Vector<double> konvertieren?
Verfasst: 28. August 2006 19:47
von reani
Hi,
Zum Einlesen meiner Datei brauche ich QTextStream. Deswegen benutze ich auch den Befehl
Mein Problem ist aber, dass Teile ich die Daten einiger Zeilen in einen QVector<double> schreiben will.
Jetzt kann ich zwar
für den Vector verwenden, aber die Datentypen sind immer noch QString.
Ich hab das ja alles schon ausprobiert und bin mit einer for-Schleife den Vector dann durchgeganen und hab die einzelnen QString's in double's umgewandelt, aber wenn ich dann mein Programm laufen lass, dann stürtzt es immer ab. Wie sich dann herausstellte ist genau dieser Block der Grund.
Kennt jemand einen anderen Weg? oder was mach ich falsch?
reani
Verfasst: 28. August 2006 20:35
von BartSimpson
Du must doch ein Fehler bekommen.
Der Debugger führt dich denn auf die richtige Spur.
Sofern du die Debuglibs von Qt benutzt.
Verfasst: 28. August 2006 23:39
von reani
danke erst mal für den Vorschlag - wollt ich auch gleich ausprobieren...
Ich benutze die Visual C++ 2005 Express Edition und ich hab es - trotz super Tutorial, das ich im Forum gefunden hab - nicht geschafft den Debugger irgendwie zum laufen zu bringen.
Die restliche Zeit hab ich's weiterprobiert - mit leider mäßigem Erfolg. Vielleicht könnte ich die QStringList casten?
Ergebnis: class 'QStringList' used where a floating point value was expected
Hier der Codeblock, bei dem mein Programm abstürzt:
Code: Alles auswählen
QVector<QVector<double>> *cVector;
cVector->clear();
while( !stream.atEnd() ) {
line = stream.readLine();
QStringList list = line.split(" ");
QVector<double> dummy;
dummy.clear();
for(int i=0; i<dimension; i++) {
dummy.append( list.value(1).toDouble() );
}
cVector->append( dummy );
}
Any ideas?
Verfasst: 29. August 2006 06:33
von Christian81
cVector nicht initialisiert
dimension ist auch falsch -> list.count() !
Verfasst: 29. August 2006 13:07
von reani
bei der dimension handelt es sich um list.count() und der cVector wurde auch initialisiert.
Verfasst: 29. August 2006 13:29
von Christian81
Ok, dann weiter
value(1) -> sollte das nicht value(1(i) heissen?
verkürze das ganz mal ein wenig - initialisere die QStringList mit eigenen Werten anstatt aus einem File zu lesen usw.
Und zeige uns den ganzen Code wo man auch sieht wie Du es initialisierst
Verfasst: 29. August 2006 13:57
von reani
hast du allerdings recht: statt dem 1 gehört wirklich ein i
Also nochmal der ganz Code:
Code: Alles auswählen
#include <QVector>
class DataModel
{
public:
void readDataFile(QString fileName);
private:
int dimension;
int base;
QVector< QVector<double> > *cVector;
};
void DataModel::readDataFile(QString fileName)
{
QFile file(fileName);
if( !file.open( QIODevice::ReadOnly ) )
return;
QTextStream stream( &file );
QString line;
cVector=NULL;
while( !stream.atEnd() ) {
line = stream.readLine();
QStringList list = line.split(" ");
//read dimension
if( list.contains("dimension") ) {
dimension = list.value(1).toInt();
}
//read base of the data
else if( list.contains("base") ) {
base = list.value(1).toInt();
}
else {
QVector<double> dummy;
dummy.clear();
for(int i=0; i<dimension; i++) {
dummy.append( list.value(i).toDouble() );
}
cVector->append( dummy );
}
}
file.close();
}
Mitlerweile hab ich auch versucht die QStringList bzw. den Vector - den ich mit toVector-Funktion bekomme - zu casten. Einmal mit dem normalen Cast:
Code: Alles auswählen
QVector<QString> vect = list.toVector();
QVector<double> dVec = QVector<double>(vect);
und mit dem static_cast:
Code: Alles auswählen
QVector<QString> vect = list.toVector();
QVector<double> dVec = static_cast< QVector<double> >(vect);
Ergebnis: no matching function for call to QVector<double>::QVector(QVector<String>&)
Verfasst: 29. August 2006 14:11
von Christian81
Wenn das der komplette Code ist, ist cVector immer noch nicht initialisiert und dimension unter Umständen auch nicht. Wenn ausserdem dimension > list.count() ist, kracht es genauso.
Das funktioniert:
Code: Alles auswählen
QVector< QVector<double> > cVector1;
QVector< QVector<double> > *cVector = &cVector1;
QString line = "19.5 17.436543 0.546743 -6.34543";
QStringList list = line.split(" ");
QVector<double> dummy;
dummy.clear();
int dimension = list.count();
for(int i=0; i<dimension; i++) {
dummy.append( list.value(i).toDouble() );
}
cVector->append( dummy );
Verfasst: 29. August 2006 14:26
von reani
great!
vielen dank!