PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++/MFC] Controls manuell editiert, jetzt Assertion Failure


WhiteVelvet
2006-06-18, 18:48:24
Ich habe mal mein Projekt aufgeräumt und alle Variablennamen der Controls einheitlich gemacht. Ich habe also folgende Dateien per Hand editiert:

myProject.h
myProject.cpp
resource.h
myProject.rc

Aber nun bekomme ich beim Start einen Assertion Failure, nur ich kann den Fehler nicht finden. Der Compiler selbst hat nichts zu beanstanden. Genau genommen stürzt das Programm ab, wenn

int nResponse = dlg.DoModal();

in InitInstance ausgeführt werden soll. Die genaue Fehlerquelle liegt in afxwin2.inl. Ich weiss, ist schwer etwas ohne Code zu finden, aber vielleicht habt Ihr ja trotzdem einen Tip :)

Gast
2006-06-18, 19:19:02
solche Fehler treten in VC++ sehr gerne dann auf, wenn man das tut was du in der Überschrift angedeutet hast: im Sourcecode an Fenstern rumspielen, die du im Ressourceneditor angelegt hast. Besonders Sachen wie CreateWindow() und DestroyWindow() sind da hochgefährlich, hingegen sind ShowWindow() oder SetWindowPos() eher harmlos.

Was genau editierst du denn an den Controls manuell? Und der Debugger wird dir doch sicherlich die Zeile in der afxwin2 anzeigen, wo es passiert. Das wird doch sicherlich eine ASSERT-Zeile sein. Guck dir doch mal das Argument von ASSERT an was da drin steht.

WhiteVelvet
2006-06-18, 19:36:39
Ich habe bloss die Control-IDs editiert, also aus IDC_EDIT ein IDC_EDITCONNECT oder sowas gemacht, und Controls komplett gelöscht, die nicht mehr gebraucht werden. Ich habe alles gegenseitig angepasst, es gibt zur Zeit keine duplicate IDs oder missing IDs, der Compiler zeigt keinerlei Fehler an.

WhiteVelvet
2006-06-18, 20:39:56
Ah, gefunden... ein EditFeld war zwar deklariert, aber wurde nicht an einen Speicherbereich gebunden...

Gast
2006-06-18, 23:08:57
WhiteVelvet[/POST]']Ich habe bloss die Control-IDs editiert, im Ressourceneditor oder per Sourcecode zur Laufzeit?

WhiteVelvet[/POST]']also aus IDC_EDIT ein IDC_EDITCONNECThört sich an, als ob du es im Ressourceneditor getan hast. Dann sollte das keine Probleme bereiten. oder sowas gemacht,

WhiteVelvet[/POST]']und Controls komplett gelöscht, die nicht mehr gebraucht werden. im Ressourceneditor zur Laufzeit per DestroyWindow()? Letzteres ist ganz übel.
Verhängnisvoll ist auch folgendes: du hast mal ein Control im Ressourceneditor angelegt und über den Klassenassistenten eine Instanz der zugehörigen MFC-Klasse (z.B. CEdit) erzeugt. Irgendwann willst du das Control nicht mehr haben und löscht es (zur Entwurfszeit im Ressourceneditor). Du vergißt aber, das MFC-Objekt ebenfalls zu entfernen, und greifst irgendwann zur Laufzeit darauf zu...

WhiteVelvet[/POST]']Ich habe alles gegenseitig angepasst, es gibt zur Zeit keine duplicate IDs oder missing IDs, der Compiler zeigt keinerlei Fehler an.Laufzeitfehler heißen nicht umsonst so: sie treten erst zur Laufzeit auf und können nicht vom Compiler vorher erkannt werden.

Gast
2006-06-18, 23:11:30
WhiteVelvet[/POST]']Ah, gefunden... ein EditFeld war zwar deklariert, aber wurde nicht an einen Speicherbereich gebunden...ich nehme an, du willst damit sagen, es existierte ein CEdit-Objekt, mit dem aber kein existierendes Edit-Fenster verknüpft war. Klingt nach dem Szenario Control im Ressourceneditor gelöscht aber vergessen MFC-Objekt zu entfernen.

TheGamer
2006-06-18, 23:31:33
Darf man Fragen warum du noch MFC benutzt? Wenns was neues ist Frag eich das

Wenns ein altes Programm ist das du aendert, ziehe ich die Frage zurueck

ScottManDeath
2006-06-19, 03:11:05
Sein Prof hat ihn zu VC6 und MFC verdammt, der Hund ;)

WhiteVelvet
2006-06-19, 18:29:58
Inzwischen durfte ich aber zu MSVC2005 wechseln :D Andere Institute nutzen das jetzt auch und da sieht er endlich mal, dass er auch umstellen muss ;) Heute höre ich, dass bald auch MFC fallengelassen werden soll und stattdessen Qt benutzt wird. Aber da mache ich nicht mit, würde zuviel Zeit verloren gehen durch die Umarbeitung. Das kann dann später jemand anderes machen ;)