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

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

10.02.2007, 18:40

Run-Time Check Failure #2 - Stack around the variable 'c' wa

Hallo zusammen (mein Standardanfang ;) ) ,

ich habe mal wieder ein mir unerklärliches Phänomengefunden. Wahrscheinlich ist es total logisch und aus eurere Sicht lächerlich, aber ist versteh des net.

Also: Ich habe folgenden Code. c steht für ein wchar_t-Array mit 9 Elementen. Diese werden dann mit Werten aus meiner Datei gefüllt. So gut soweit. Aber ganz am Ende, also, nachdem return 0 verarbeitet wurde kommt der Fehler: Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted. Warum? Mein Array hat doch die passenden Größe, oder?

Was passt hier nicht?

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
26
    int i=0;
    wchar_t a, c[9];

    ifstream FileIn2("lab.txt"); 
    if (FileIn2)
    { 
        while(FileIn2.good())
        {
            a = FileIn2.get();
            if(a != L'\n')
            {
                c[i] = a;
                wcout << c[i] << endl;
                i++;
            }
        }
    }


    cout << "=====================================" << endl;
    cout << "Programmende" << endl;
    cout << "=====================================" << endl;
    cin.ignore();

    return 0;
}


Grüße - spacegaier (mein Standardendsatz ;) )

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

3

10.02.2007, 19:32

i ist am Ende 10, wird aber nur 9mal als Index fpr das c-Array genutzt, da meine Datei so aussieht:

121
212
121

4

10.02.2007, 20:18

Du liest zu viele Daten ein und überschreitest die grenzen deines Arrays!

Du musst diesen Block erweitern

C-/C++-Quelltext

1
2
3
4
5
6
if(a != L'\n') 
{ 
      c[i] = a; 
      wcout << c[i] << endl; 
      i++; 
}


Denn eigentlich ist '\n' nicht ausreichen um eine neue Zeile zu beginnen, da ja nur in die nächste Zeile gerückt wird. Eigentlich muss der Cursor erst an den Anfang der Zeile gerückt werden, was auch viele Editoren machen. Das Zeichen hierfür is '\r' und wird in der Kombination "\r\n" verwendet.

Also schreib den Block so um

C-/C++-Quelltext

1
2
3
4
5
6
if(a != L'\n' && a != L'\r') 
{ 
       c[i] = a; 
       wcout << c[i] << endl; 
       i++; 
}


Generell finde ich deine Art sehr gefährlich, da dein Programm bei falschem Input zwangsläufig abstürzt. Du solltest vorher die ganze Datei durchlaufen und zählen wie viele Zeichen vorhanden sind. Bzw. wie viele Zeichen vorhanden sind die du auswerten willst.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

5

10.02.2007, 20:22

Danke für den Hinweis. Der Fehler taucht aber leider immer noch auf.

Wenn ich das Array auf 10 Felder erhöher geht es ohne Fehler. Aber ich fülle doch nur 9 Felder ?!? Warum dann der Fehler?

6

10.02.2007, 20:24

Benutz mal den Debugger und schau, wie David bereits sagte, wie groß die Variable i wird.

Du kannst auch deine Schleife so umbauen, dass die Grenze nicht überschritten werden kann

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
while(FileIn2.good() && i < 9) 
{ 
      a = FileIn2.get(); 
      if(a != L'\n') 
      { 
           c[i] = a; 
           wcout << c[i] << endl; 
           i++; 
      } 
}


EDIT:
Was bewirkt eigentlich

C-/C++-Quelltext

1
FileIn2.good()


Könnte es sein das es auch noch true zurück gibt wenn EOF gelesen wird? Shcließlich ist es ja ein gültiges Zeichen. Könnte also sein das EOF noch gelesen wird und erst danach ein false zurück kommt. ist aber nur eine Vermutung.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

10.02.2007, 20:30

Zitat von »"spacegaier"«

i ist am Ende 10

Beim letzten Durchlauf ist i also 9. Und da dein Array nur 9 Elemente hat, ist der Index 9 zu groß. Arrays beginnen bei 0. 8 wäre also das letzte Element, aber du schreibst auf 9.

8

10.02.2007, 20:33

David hat recht, darauf hatte ich gar nicht mehr geachtet :D
Also wird dein Letztes Zeichen wohl EOF sein.

So wie ich die while-Schleife umgebaut hab kannst du zumindest Abstürze vermeiden.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

9

10.02.2007, 20:37

Stimmt, danke, jetzt läuft es ohne Probleme.

10

11.02.2007, 10:07

std::fstream::good
Diese Funktion wird zumeist genutzt, um festzustellen ob ein Lese- bzw. Schreibvorgang erfolgreich durchgeführt wurde.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige