Nach XML anlegen Heap Fehler

Alles rund um die Programmierung mit Qt
Antworten
seasar
Beiträge: 4
Registriert: 25. Juli 2007 09:13

Nach XML anlegen Heap Fehler

Beitrag von seasar »

Hallo,
ich habe folgendes Problem das mich schon seit Tagen beschäftigt. Ich hoffe das ihr mir helfen könnt.

Problem: Ich stelle aus einigen Daten eine XML file zusammen und speichere diese ab. Nach dem speichern kommt eine Warnung das etwas mit Heap nich stimmt. Dabei wiederholt sich die Warnung entsprechend der angelegten Elemente in der XML File. Den Mustercode habe ich aus einem Qt Buch, diesen habe ich bereits erfolgreich in einem anderen Programm verwendet.
Mein System 2000 und XP mit VisualStudio 2005 Pro Edition
Qt: 4.2.2


Also meine Funktion:

Code: Alles auswählen

void WriteToXML()
{
	QString XMLFileToSave = "Values.xml";
	//QFile file(XMLFileToSave);
	QFile XMLFile(XMLFileToSave);

	if(!XMLFile.open(QIODevice::WriteOnly))
	{
		QMessageBox::warning(this, "Warnmeldung", "XML-Datei: " + XMLFileToSave + " konnte zum Schreiben nicht geöffnet werden!", "OK", 0);
	}
	else
	{	
		const int Ident = 4;		//Groesse des Einzugs (Platz zwischen Knoten) von der Xml

		QDomDocument mydoc;
		
		//Das ist das root von dem XML Baum, wird für den Anfang benötigt

		//*********************************************
		/*ab der nächsten  Zeile beginnen die Probleme */

		QDomElement root = mydoc.createElement("trainingswerte");
		mydoc.appendChild(root);

		/* Strings fuer die Knoten mit den Trainingswerten */
		QString IOQuantilString = "IOQuantil";
		QString IOContrastString = "IOContrast";
		QString NIOQuantilString = "NIOQuantil";
		QString NIOContrastString = "NIOContrast";

		//Elemente für die einzelnen Werte
		QDomElement vectIOQuantilElement = mydoc.createElement(IOQuantilString);
		QDomElement vectIOContrastElement = mydoc.createElement(IOContrastString);
		QDomElement vectNIOQuantilElement = mydoc.createElement(NIOQuantilString);
		QDomElement vectNIOContrastElement = mydoc.createElement(NIOContrastString);

		//Elemente als Knoten in XML einbinden 
		root.appendChild(vectIOQuantilElement);
		root.appendChild(vectIOContrastElement);
		root.appendChild(vectNIOQuantilElement);
		root.appendChild(vectNIOContrastElement);

		//Kontrolle damit die Vektoren auch immer etwas enthalten (Sollte sinnvoll sein)
		if (vectIOQuantil.isEmpty())
		{
			vectIOQuantil.resize(0);   //Der Verctor wird == 0 gesetzt damit wir einen Wert haben
		}
		if (vectIOContrast.isEmpty())
		{
			vectIOContrast.resize(0);   //Der Verctor wird == 0 gesetzt damit wir einen Wert haben
		}
		if (vectNIOQuantil.isEmpty())
		{
			vectNIOQuantil.resize(0);   //Der Verctor wird == 0 gesetzt damit wir einen Wert haben
		}
		if (vectNIOContrast.isEmpty())
		{
			vectNIOContrast.resize(0);   //Der Verctor wird == 0 gesetzt damit wir einen Wert haben
		}


		//Hier werden die einzelnen Werte eingesetzt
		//Immer in eigener Schleife weil die Groeße der Verctoren variiren kann (unterschiedliche Lauflaenge)

		for (int i = 0; i < vectIOQuantil.size(); i++)
		{
			vectIOQuantilElement.setAttribute("NR_" + QString::number(i),vectIOQuantil.value(i));
			vectIOQuantilElement.setAttribute("Anzahl",i);
		}

		for (int i = 0; i < vectIOContrast.size(); i++)
		{
			vectIOContrastElement.setAttribute("NR_" + QString::number(i),vectIOContrast.value(i));
		}

		for (int i = 0; i < vectNIOQuantil.size(); i++)
		{
			vectNIOQuantilElement.setAttribute("NR_" + QString::number(i),vectNIOQuantil.value(i));
		}

		for (int i = 0; i < vectNIOContrast.size(); i++)
		{
			vectNIOContrastElement.setAttribute("NR_" + QString::number(i),vectNIOContrast.value(i));
		}





		//Speichert den XML Baum
		//QTextStream out(&file);
		QTextStream out (&XMLFile);
		mydoc.save(out, Ident);

		QMessageBox::information(this,"XML speichern","Die XML wurde gespeichert","OK",0);
	
	}
	/*file.close();*/
	XMLFile.close();
}

Sobald ich ein QDomDocument anlege kommen die Probleme und folgende Ausgabe wobei das output nicht wirklich hilft:

***************************************************
Windows has triggered a breakpoint in Student_Busch.exe.

This may be due to a corruption of the heap, and indicates a bug in Student_Busch.exe or any of the DLLs it has loaded.

The output window may have more diagnostic information
***************************************************

Was mache ich falsch? Ähnliches hat ja schon mal funktioniert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

wobei das output nicht wirklich hilft:
Dann verwende einen (vernünftigen) Debugger...
seasar
Beiträge: 4
Registriert: 25. Juli 2007 09:13

Beitrag von seasar »

ja gut, Erfahrung habe ich sehr wenig damit.
Ich riskiere mal die Frage: Was ist den ein guter Debugger?

Muss morgen schauen was wir überhaupt verwenden.

Wie ist das mit dem Quelltext? Ist doch in dem Sinne alles in Ordnung, der Compiler meckert auch nicht.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ein Debugger ist dann gut, wenn der, der ihn benutzt, die Fehler findet, die er sucht...
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Visual Studio hat einen sehr sehr guten Debugger integriert. Benutze diesen. Wenn du nicht weißt wie man ihn benutzt, dann lies die Anleitung.
seasar
Beiträge: 4
Registriert: 25. Juli 2007 09:13

Beitrag von seasar »

Obwohl ich in dem Bereich nicht so viel Erfahrung habe weiß ich das das VS Debugger seine Arbeit ordentlich macht. Leider sagte mir das ganze wegen der fehlenden Erfahrung wenig.

Habe jetzt das Problem behoben. Ich habe die falsche QtXML lib in das Projekt eingebunden.

Danke euch für die Ratschläge. Hoffe das mit Erfahrung weniger solcher Fragen von mir kommen
:D
Antworten