Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.01.2011, 13:08

Run-Time Check Failure #2 - Stack around the variable 'Karte' was corrupted.

Hallo Zusammen.

Ich habe mich über diesen Fehler schon hier im Forum und auch bei Google Infomiert aber so wirklich weitergeholfen hat mir alles nicht.
Also dieser Fehler Tritt auf wenn ich mein Programm Beende. Ich weiß auch woran an es liegt aber ich komme auf keine Lösung.

Mal ein Bisschen Code.
In meine Klasse Charakter.h

C-/C++-Quelltext

1
2
/* Fehlercode Pointer */
St_FehlerCode::en_FehlerCode* Fehler;


in Charakter.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CCharakter::CCharakter(void)
{
...
// Fehler Pointer
Fehler = new St_FehlerCode::en_FehlerCode;
Fehler = 0;
}
bool CCharakter::Func_Fehler_PtrAdr_Setzen(St_FehlerCode::en_FehlerCode *gl_Fehler)
{
if (gl_Fehler != 0)
{
Fehler = gl_Fehler;
return true;
}
else
{
return false;
}
}


in Meiner Klasse Karte
in Karte.h

C-/C++-Quelltext

1
2
3
4
5
6
/* Spieler */
CCharakter Spieler;
/* Fehler Code zur Ausgabe in MSGBOX */
St_FehlerCode::en_FehlerCode FehlerCode;
/* Fehler Auswerten über eine MSGBOX */
void Func_Fehler_Auswerten();


in Karte.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CKarte::CKarte(void)
{
...
FehlerCode = St_FehlerCode::FC_OK;
Spieler.Func_Fehler_PtrAdr_Setzen(&FehlerCode);
}

void CKarte::Func_Fehler_Auswerten()
{
string FehlerText = "";
switch(FehlerCode)
{
// Datei nicht gefunden
case St_FehlerCode::FC_ALG_DATEINICHTGEFUNDEN:
FehlerText = "Datei nicht gefunden.";
break;
// Attributspunkte Fehlen
case St_FehlerCode::FC_CHAR_KEINEATTRIBUTSPUNKTE:
FehlerText = "Zuwenig oder Keine \nAttributspunkte zur Verfügung";
break;
};
#if defined(_DEBUG)
std::cout << FehlerText <<endl;
#endif
}


Sorry Für die Formatiereung funktioniert irgendwie net so recht.

Also mit höchster Wahrscheinlichkeit liegt es an dem Pointer für den FehlerCode.
Im Destruktor der beider Klassen Steht nichts.
Ich habe schon Versucht via delete in der Charakterklasse den mit new erzeugeten pointer zu löschen bzw auf null zu setzen aber es hilft nix.

Habt ihr ein lösungsvorschlag mir fällt leider keiner ein ?

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

2

15.01.2011, 13:27

Wieso hast du für den Fehlercode einen Pointer wenn der Code nur ein Enum zu sein scheint? Das ist absolut unnötig, aber noch unnötiger ist es deinen Fehlercode Pointer per new zu setzen und dann mit = 0 wieder auf 0 zu setzen.

Ich nehme an dir ist das Konzept der Pointer noch recht neu aber wenn du einen Wert zu der variable hinter dem Pointer setzen willst musst du deinen Pointer erst dereferenzieren. Ansonsten überschreibst du nur die Pointeradresse aber nicht den Wert der sich dahinter verbirgt.

Btw irgendwas fehlt doch an dem Code, was passiert denn am Ende deines Programmes? Löschst du deinen Fehlercode Pointer mit delete? Dann würde es das auch schon erklären, du überschreibst deinen Fehlercodepointer mit einer Adresse die keine echte Adresse ist und rufst darauf ein delete auf, dadurch schreibst/löscht du in Speicherbereichen die gar nicht für dich reserviert sind.

mfg Mark

3

15.01.2011, 13:40

Also so neu ist mir das Konzept auch net kann sein das ich es 100 % noch nicht verstanden habe.

Ich habe nen pointer genommen weil aus mehreren Klasssen später verschiedene Fehler (und ja ist nur ne Enum) über Pointer in die Variable FehlerCode (Aus der Klasse Karte) geschrieben wird, wo dann die Fehler ausgelesen werden können.
Auf 0 wird der Fehler (in der Charakterklasse) gesetzt weil ihm erst noch die Adresse von der Variablen zugewiesen wird.
Hoffe meine Gedanken gänge sind verständlich.

Am ende Des Programms wird die main mit return 0; Beendet.
Ach und Karte wird in main erstellt und die Charakter klasse ist bestandteil von der Kartenklasse.
Und es Funktioniert so wie mir das Vorstelle nur halt beim Beenden.
Mit der Funktion Func_Fehler_PtrAdr_Setzen wird dem Pointer Fehler die Richtige Adresse zugewiesen.

in dieser Funktion kommt dann z.B. ein Fehler zum tragen der dann auch "übermittelt" wird und ausgelesen werden kann.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool CCharakter::Func_Erhöhe_Koerperkraft()
{
    if (i_AttributPunkte)
    {
        i_Koerperkraft++;
        fl_TragKraftMax = i_Koerperkraft * 2000.0f;
        i_AttributPunkte--;
        return true;
    }
    else
    {
        // Keine Punkte zum Erhöhen
        *Fehler  = St_FehlerCode::FC_CHAR_KEINEATTRIBUTSPUNKTE;
        return false;
    }
}


Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

4

15.01.2011, 14:07

Wie ist denn St_FehlerCode definiert? Das ist doch sicher nur eine Klasse welche ein enum hält, wozu brauchst du dann überhaupt ein Pointer für den fehlercode? Das bringt dir doch keinerlei Vorteile.

Zitat

Auf 0 wird der Fehler (in der Charakterklasse) gesetzt weil ihm erst noch die Adresse von der Variablen zugewiesen wird.
Hoffe meine Gedanken gänge sind verständlich.
Dann solltest du aber nicht

C-/C++-Quelltext

1
Fehler = 0;


sondern

C-/C++-Quelltext

1
*Fehler = 0;


benutzen.

5

15.01.2011, 18:10

Wie ist denn St_FehlerCode definiert? Das ist doch sicher nur eine Klasse welche ein enum hält, wozu brauchst du dann überhaupt ein Pointer für den fehlercode? Das bringt dir doch keinerlei Vorteile.
Ja ist nur Nen Struct. Ich Pack meine Enums immer da rein weil ich sonst Tausende von Enum Namen hätte, da ich damit sehr viel Arbeite.
Nen Pointer nehme ich um Klassenübergreifend auf eine einzige Variable zu greifen zu können die ich dann auch nur in einer Funktion auswerte. Und ob der Pointer auf nen Enum oder ein int oder ne ganze klasse verweist ist doch egal.

es muss heißen

C-/C++-Quelltext

1
Fehler = 0;

weil ich nicht den Inhalt des Fehler ptr auf 0 Setzen möchte sondern die Adresse des Pointers auf die er zeigt.

Ich möchte hier aber nicht mein Programmier stiel verteidigen sondern hätte gern ein lösungs ansatz.
Wie schon gesagt das ganz funktioniert soweit wie ich mir das vorstelle nur beim Beenden des Programms bringt er mir den fehler.

Danke.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

6

15.01.2011, 18:20

Hmmm nu bin ich Sprachlos...

Habe mein Programm erneut gestart und der Fehler ist weg obwohl am code nichts geändert wurde.

Komisch.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

7

15.01.2011, 19:33

Ich möchte hier aber nicht mein Programmier stiel verteidigen sondern hätte gern ein lösungs ansatz.


Sei doch froh, dass du Vorschläge bekommst, wie du deinen Stil verbessern kannst...

8

15.01.2011, 20:08

Sei doch froh, dass du Vorschläge bekommst, wie du deinen Stil verbessern kannst...

Naja vllt habe ich mich ja nicht richtig Ausgedrückt aber mir scheint DerMark hat nicht verstanden wie das funktionieren sollte.
Und nen Wirklichen Vorschlag gabe es nicht was zu verbessern (Aus meiner Sicht) und von einem Lösungsansatz ganz zu schweigen aber das ist ja jetzt eh hinfällig da mir scheint das Problem war gar keins Bzw. eins von VC++.
Habe das Programm jetzt über 10 mal ohne Fehler Compiliert und gestartet.

Selbstverständlich bin ich froh um vorschläge Sachen besser zu machen ich habe mir viel wissen selber angeeignet und habe bestimmt noch ne Menge zu lernen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

9

16.01.2011, 12:20

Sei doch froh, dass du Vorschläge bekommst, wie du deinen Stil verbessern kannst...

Naja vllt habe ich mich ja nicht richtig Ausgedrückt aber mir scheint DerMark hat nicht verstanden wie das funktionieren sollte.
Und nen Wirklichen Vorschlag gabe es nicht was zu verbessern (Aus meiner Sicht) und von einem Lösungsansatz ganz zu schweigen aber das ist ja jetzt eh hinfällig da mir scheint das Problem war gar keins Bzw. eins von VC++.
Habe das Programm jetzt über 10 mal ohne Fehler Compiliert und gestartet.

Selbstverständlich bin ich froh um vorschläge Sachen besser zu machen ich habe mir viel wissen selber angeeignet und habe bestimmt noch ne Menge zu lernen.
Danke für die Blumen Oo.

Viel mehr als das was ich schrieb konnte ich mir nun nicht wirklich aus den Fingern saugen, dank des ziemlich unvollständigen Codes, meine Lösungsvorschläge bezogen sich alle auf den FehlerCode eben weil das Design dafür ziemlich wirr ist und einfach so Verbesserungsvorschläge für einen Code den ich nicht in der Gänze überblicken kann, gebe ich sicher nicht freiwillig ohne eine extra Aufforderung.

So richtig scheinst du das Pointersystem aber dann dennoch nicht verstanden zu haben, keine Anfeindung, aber was bitte bringt es einen Pointer zu erzeugen um sie danach ohne sie zu löschen und gar zu benutzen gleich wieder auf 0 zu setzen.

Nur weil den Fehler grade nicht wieder auftritt muss dies nichts bedeuten, einfach so verschwinden solche Fehler normalerweise nicht, von daher sei vorsichtig was das Verschwinden des Fehlers angeht, vermutlich lauert er noch.

10

16.01.2011, 14:02

Siehst sag ich ja vllt liegts an mir ich wollte dich net angreifen sorry wenn das so rüberkam.

Das der Fehler vllt noch da ist nur gerade nicht zum tragen kommt habe ich mir auch schon gedacht also mal abwarten.
Aber ich versuche noch mal zu erklären wie ich mir das gedacht habe.

Also ich Deklariere in meiner Charakterklasse einen Pointer für Mein FehlerCode (was eine Enum ist)
Diese wird dann aber auf die Adresse 0 gesetzt im Konstruktor aus dem Grund weil mir die derzeitige Pointeradresse gar nichts nützt.
Dafür habe ich eine Funktion Geschrieben die mir die Pointer Adresse auf eine Variable (vom typ en_Fehlercode) setzt die sich in der Klasse Karte befindet. Ebenfalls befindet sich in der Karten Klasse eine Funktion um die Fehler über eine MessageBox auszugeben.

Die Fehler die hier Überprüft werden sind jene die der Anwender in meinem Programm machen kann. Und da soviele Funktion den Typ void zurückgeben und der Anwender unter umständen gar nicht weiß wieso etwas nicht funktioniert habe ich mir gedacht ich mach aus void bool und immer dann wenn die Funktion false zurück gibt wird die Funktion für die Auswertung aufgerufen.

Du hast natürlich recht ich muß die Adresse nicht auf 0 Setzen ich kann sie auch so belassen und dann warten bis sie auf die richtige Adresse zeigt.

So wenn du jetzt verstanden hast wie ich mir das gedacht habe bin ich über Verbesserungsvorschläge dankebar.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige