Kennt sich jemand mit wxWidgets ehem wxWindows aus?

songbird

Grünschnabel
Die Überschrift sagt wohl alles .

Das Problem ist, dass wir eine Methode geschrieben haben, die in einer Consolen-Anwendung auch funktioniert. Nur wenn wir sie in die GUI einbauen, führt sie zum Programmabsturz...
 
Also im Prinzip ist es diese Methode, die nicht funktioniert:

Code:
/*
 * Die Methode OnQuit wird nach Auswahl des entspr. Menueeintrags
 * aufgerufen und sorgt fuer das Schliessen des Fensters.
 */
void MyFrame::OnQuit( wxCommandEvent & WXUNUSED(event) )
{
   vecToTXT();
   Close( TRUE );
}

die vecToTXT() sieht folgendermaßen aus:
Code:
void vecToTXT()
{
	char* datei;
	ofstream dh0("cdAudio.txt", ios::out);
	dh0 << "";	

	for(int i = 0; i < getMainVec().size(); i++)
	{		
		if(getMainVec()[i]->getType() == "Audio-CD")
		{
			ofstream dh("cdAudio.txt", ios::app);
			CdAudio *cd = new CdAudio();
			cd = dynamic_cast<CdAudio*>(getMainVec()[i]);
			
			dh << cd->getInterpret() << '#' <<
			           cd->getTitle() << '#' <<
			           cd->getId() << '#' <<
			           cd->getLength() << '#' <<
			           cd->getIsBoot() << '#' <<
			           cd->getGenre() << '#' <<
			           cd->getPlace() << '#' <<
			           cd->getLent() << '#' <<
			           cd->getLentByName() << '#' <<
			           cd->getLentByMail() << '#' <<
			           cd->getReleaseYear() << '#' <<
			           cd->getComment() << '#' <<
			           cd->getIsSingle() << '#'; 
			dh.close();
		}
	}
}
An der kann es aber eigentlich nicht liegen, da sie iin einer COnsolenanwendung funktioniert und da der Programm-Absturz auch kommt, bevor die erste Anweisung dieser Methode ausgeführt wird...

Und auf'm MAC stürzt das Programm nicht ab...
 
Der ofstream könnte das Problem sein (muss aber nicht).
Das ganze Io-Gefusel muss (zumindest unter Windows) initialisiert werden (mit zuständiger .dll verbinden, usw).
Dafür gibt es eine Routine (die hat auch noch mehr Aufgaben, aber unter anderem das), die sogar noch vor der main bzw WinMain ausgeführt wird und dann diese aufruft, je nachdem, ob du Console oder GUI schreibst, also der eigentliche Program-Entry.
Wenn du also einen anderen einstiegspunkt definiert hast, lass das weg.
In der Version für die Console wird in jedem Fall das Io-Zeugs initialisiert, bei meiner GUI-Version auch, ob das zwingend auch für andere Implementierungen ist, weiss ich nicht (sollte aber schon, immerhin gehören die streams ja zum c++-standard).
Sonst weiss ich nicht, was das Problem sein könnte.
 
Zuletzt bearbeitet:
Also was das Problem ist kann ich auch so nicht sagen...
ausser vielleicht

1. ofstream dh0("cdAudio.txt", ios::out);
2. ofstream dh("cdAudio.txt", ios::app);

kenne mich mit iostreams nicht so aus, aber 2x die selbe datei öffnen könnte fehler geben
und...

Code:
CdAudio *cd = new CdAudio();  cd = dynamic_cast<CdAudio*>(getMainVec()[i]);

sollte eigentlich auch das tun

Code:
CdAudio *cd=(CdAudio *)getMainVec()[i];

und du bist ganz sicher daß es abstürzt noch bevor vecToTxt() aufgerufen wird?
oder irgendwo in der vecToTxt
 
Also es scheint an dem dynamic_cast gelegen zu haben... Wir haben es jetzt zu einem static_cast gemacht und nun geht es...

Aber danke für den Tip, dass es auch mit
Code:
CdAudio *cd = (CdAudio*) mainVec[...]
gehe müsste!
 
Zurück