[gelöst] QStringList in Vector<double> konvertieren?

Alles rund um die Programmierung mit Qt
Antworten
reani
Beiträge: 24
Registriert: 23. August 2006 23:28

[gelöst] QStringList in Vector<double> konvertieren?

Beitrag 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
Zuletzt geändert von reani am 29. August 2006 14:27, insgesamt 1-mal geändert.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.
reani
Beiträge: 24
Registriert: 23. August 2006 23:28

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

cVector nicht initialisiert
dimension ist auch falsch -> list.count() !
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
reani
Beiträge: 24
Registriert: 23. August 2006 23:28

Beitrag von reani »

bei der dimension handelt es sich um list.count() und der cVector wurde auch initialisiert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
reani
Beiträge: 24
Registriert: 23. August 2006 23:28

Beitrag 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>&)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 );
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
reani
Beiträge: 24
Registriert: 23. August 2006 23:28

Beitrag von reani »

great! :mrgreen:

vielen dank!
Antworten