Kampfkartoffel Geschrieben 1. August 2006 Geschrieben 1. August 2006 Hallo an Alle, ich habe zur Zeit ein Fehler, bei dem ich nicht recht weiterkomme. Ich habe eine PropertySheet-Struktur, deren Pages verschiedene Dialoge sind. So weit, so gut. Wenn ich nun in einem Dialog (Dialog 3) aber weitere Variablen deklariere, startet das Programm ohne Probleme. Beim Beenden jedoch, kommt folgende Fehlermeldung: Run-Time Check Failure #2- Stack around the variable "Dialog3" was corrupted. und der Debugger beendet sich nicht. Dabei ist es egal, ob ich Variablen oder Pointer anlege. Im Klartext, wenn ich zu meinem jetzigem Dialog auch nur eine Variable dazu anlege, kommt diese Fehlermeldung. Beim Belassen des Dialogs in seinem Grundzustand, kann ich keine Fehler feststellen. Ich kann mir nicht vorstellen, dass der Stack keinen freien Speicher mehr hat. Hat jemand einen Tip? Gruß KK Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Beim Belassen des Dialogs in seinem Grundzustand, kann ich keine Fehler feststellen.Der Fehler ist aber trotzdem da. Die Fehlermeldung besagt, dass du irgendwo in Speicher herumgeschrieben hast, der dir nicht gehört. Da das auf dem Stack passiert, ist es wohl eine lokale Variable (oder eine Membervariable einer Klasse, von der du eine lokale Instanz anlegst). Vermutlich eine Bereichsüberschreitung bei einem Array. Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Hallo Klotzkopp, danke für die schnelle Antwort. Kann ich aufgrund der Fehlermeldung davon ausgehen, dass sich der Fehler auf den Dialog3 beschränkt, oder interpretiert der Debugger nur die Symptome, so dass er eine Fehlermeldung raushaut, die die möglichen Symptome beschreibt, aber nicht die Ursache? Gruß KK Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Habe nun herausbekommen, dass es an meiner FILE-Variablen lag. Ich habe in einer Funktion einen Stream erzeugt, der offenkundig das Problem vertursachte. Ist es problematisch einen Stream innerhalb einer Funktion zu deklarieren? Auf jeden Fall danke für Deinen Hinweis Klotzkopp. Gruß KK Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Habe nun herausbekommen, dass es an meiner FILE-Variablen lag. Ich habe in einer Funktion einen Stream erzeugt, der offenkundig das Problem vertursachte.Vorsicht. Dadurch, dass sich der Fehler nach einer Änderungen nicht mehr bemerkbar macht, kannst du nicht folgern, dass die Änderung die Fehlerursache beseitigt hat. Eine einfach FILE-Variable verursacht so einen Fehler nicht. Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Ja, das leuchtet mir ein, da sich der Fehler den, ich hatte (habe), ja auch erst jetzt bemerkbar gemacht hat. Allerdings habe ich im gesamten Dialog keine Felder, sondern nur normale Variablen. Mir ist nicht klar, wie ich mit Variablen falschen Speicher beschreiben kann. Es ist ja nicht so, dass ich die Variablen im Speicher komplett selber anlege. Gruß KK Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Es ist weniger eine Frage der Variablen, als was du mit ihnen machst. Was machst du denn z.B. mit dem FILE? Irgendwelche Lesevorgänge? Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Ja, ich lese aus einer Datei Werte aus, die in eine Liste und eine ComboBox übertragen werden Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Dann zeig doch mal den Code dazu. Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Code meiner Funktion: int Cursor; sTemp=pDaten->GetDateiPfad()+"ComboHauptRadialLager.vorg"; stream_r_Vorgabe=fopen(sTemp,"r"); fgets(cTemp,190,stream_r_Vorgabe); while(!feof(stream_r_Vorgabe)) { sTemp=pDaten->Str_W_End(cTemp); //Löscht \n-Zeichen Cursor=sTemp.Find(',',0); sTemp=sTemp.Mid(0,Cursor); ComboHaRaLager.AddString(sTemp); ListHaRaLager.AddTail(sTemp); fgets(cTemp,190,stream_r_Vorgabe); } Zur Erklärung: in der Datei stehen Lagernamen, sowie deren Werte, alles durch Komma getrennt. Die Werte werden bei Auswahl des Lagers aus der ComboBox in Felder des Dialogs eingetragen. Daher suche ich im String jeweils nach den Kommas. Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Und was ist cTemp? Kein Array? Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Natürlich ist cTemp ein Array, aber cTemp ist so groß, dass es nur Überladen werden würde, wenn der String mehr als 199 Zeichen hätte und das hat er nicht mal im Ansatz. Ich habe cTemp extra so groß gewählt, damit ich diese Fehler ausschließen kann. PS: Zumal ich cTemp ja mitteile, wieviel Zeichen es einlesen soll. Gruß KK Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Natürlich ist cTemp ein Array Soviel zu Allerdings habe ich im gesamten Dialog keine Felder , aber cTemp ist so groß, dass es nur Überladen werden würde, wenn der String mehr als 199 Zeichen hätte und das hat er nicht mal im Ansatz.Hast du das geprüft? Wie sieht Str_W_End aus? Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Da ich die Datei, die eingelesen wird, selber schreibe, sehe ich ja wieviele Zeichen pro String ich erhalte. Wenn es 50 sind, ist das viel. Kann man so sehen, muss man aber nicht. Ich habe dieses nicht zu den Feldern gezählt, weil es cTemp[200] ist und immer nur mit 190 befüllt wird. Wo soll da ein Fehler liegen? Darüber hinaus ist mir wohl nicht daran gelegen, den Leuten, die mir helfen möchten ans Bein zu pinkeln. meine andere Funktion: String Str_W_End(char cTemp[]) { int laenge; CString String; laenge=strlen(cTemp); String=CString(cTemp,laenge-1); return String; } Zitieren
phax Geschrieben 1. August 2006 Geschrieben 1. August 2006 Hast du auch mal geschaut, ob Cursor=sTemp.Find(',',0); nicht vielleicht -1 oder so zurück liefert? Leider kenne ich mich mit dem CString zuwenig aus, aber überprüf mal im Debugger, ob der auch wirklich mit \0 abschließt: String=CString(cTemp,laenge-1); hth Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Hallo phax, Wie gesagt, die Datei schreibe ich selber, so dass hinter dem Namen, mit dem ich meine ComboBox befülle immer ein Komma steht, das gibt mir auch mein Debugger aus. Er befüllt darüber hinaus die ComboBox mit den richtigen Namen. Bei einem eingelesenen Char-Feld ist das letzte Zeichen, wenn die Zeichenfolge kürzer als die eingelesenen Zeichen war, immer das End-of-Line-Zeichen. Da dieser Fall bei mir immer eintritt, sehe ich dort keine Probleme. Wenn diese Funktion nicht korrekt arbeiten würde, würde es mir zeimlich schnell auffallen. Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Wo soll da ein Fehler liegen?Ohne dir zu nahe treten zu wollen: Wenn deine Fähigkeit, erkennen zu können, wo der Fehler liegt, über jeden Zweifel erhaben wäre, müsstest du dann hier fragen? Darum frag ich nochmal: Hast du das geprüft, oder "nur" logisch gefolgert? Darüber hinaus ist mir wohl nicht daran gelegen, den Leuten, die mir helfen möchten ans Bein zu pinkeln.Darum geht's nicht. Du stellst dir selbst ein Bein, wenn du potentiellen Helfern Informationen vorenthältst. Hast du noch andere Arrays in dieser Klasse? Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Hast du das geprüft, oder "nur" logisch gefolgert? Die längste Zeichenfolge in der Datei hat 43 Zeichen. Die Zeichenfolgen können auch bei Erweiterung aufgrund der Werte aber niemals über 80 Zeichen kommen. Das würde ich als geprüft ansehen. Jetzt mal anders gefragt: Wie kann ein Array über seinen Bereich hinaus beschrieben werden, wenn es 199 char-Werte aufnehmen kann und immer nur 190 zugewiesen bekommt? Hast du noch andere Arrays in dieser Klasse? Ich habe noch ein CList-Objekt. Da ich dieses aber nicht dazu zähle, da es sich selbst verwaltet, habe ich keine weiteren Arrays mehr. Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Wie kann ein Array über seinen Bereich hinaus beschrieben werden, wenn es 199 char-Werte aufnehmen kann und immer nur 190 zugewiesen bekommt?Kann es nicht. Das ist auch nicht das Problem. Das Problem ist, ob man das vermutet, oder ob man das geprüft hat. Mach doch bitte mal das hier: String Str_W_End(char cTemp[]) { int laenge; CString String; laenge=strlen(cTemp); if(laenge < 1 || laenge > 80) AfxMessageBox("hoppla!" ; String=CString(cTemp,laenge-1); return String; }[/code] Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Ich habe die Sache ein wenig modifiziert, wenn Du erlaubst. Denn Str_W_End steht in meiner Datenklasse, auf die alle Pages Zugriff haben und in der alle Daten gespeichert werden. Die Str_W_End-Funktion wird also von jeder Page benutzt. Da es auf den anderen Pages auch Bereiche gibt, die mehr als 80 Zeichen haben können, habe ich also aus 'laenge >80' 'laenge >195' gemacht. Damit wurden dann alle Funktionsbenutzungen vom gesamten Programm überprüft und es tauchte kein "Hoppla" auf. Zitieren
Klotzkopp Geschrieben 1. August 2006 Geschrieben 1. August 2006 Geht doch. Was liegt vor und nach Dialog3 auf dem Stack? Zitieren
Kampfkartoffel Geschrieben 1. August 2006 Autor Geschrieben 1. August 2006 Ich denke doch mal, davor müsste der VorDialog also die Page, die davor im "Show"-Modus war auf dem Stack liegen und danach, die Page, die man danach auswählt. Das können aber immer andere sein, ich habe ja keine Wizard-Struktur. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.