Zum Inhalt springen

VC++ Fehler bei weiteren Variablen


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

:rolleyes:

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...