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

Code: Alles auswählen

QString line;
QStringList list = line.split("");
Mein Problem ist aber, dass Teile ich die Daten einiger Zeilen in einen QVector<double> schreiben will.
Jetzt kann ich zwar

Code: Alles auswählen

QVector<QString> vect = list.toVector();
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. :evil:

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! :mrgreen:

vielen dank!