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

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

1

28.03.2015, 12:13

Absturz: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000008

Hallo Leute!

Wie in der Überschrift schon zu lesen ist stürzt mein Spiel, was ich zur Zeit programmiere, nach einer gewissen Zeit (2-4 min) immer ab.
Als Fehlermeldung kommt folgendes:

Zitat

Eine Ausnahme (erste Chance) bei 0x00e3c711 in testSDL2010.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000008.
Unbehandelte Ausnahme bei 0x00e3c711 in testSDL2010.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000008.


Visual Studio zeigt den Fehler an dieser Stelle an:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void CSpieler::statusleisterendern (SDL_Surface *screen)
{
//Anzahl Energie (als Zahl) anzeigen
    std::stringstream energiestream;
    energiestream << energie; //energie ist int
    textenergie = TTF_RenderText_Solid (font, energiestream.str().c_str(), colorwhite);
    setimage (180.0f, 691.0f, textenergie->h, textenergie->w, textenergie, screen);
}


Wenn ich die Zeilen auskommentiere dann kommt dasselbe bei der Lebensanzeige u.s.w., ich gehe desshalb davon aus, dass das an den stringstreams liegt. Ich arbeite damit auch das erste mal, also geh ich davon aus, dass ich die falsch verwende.
Ich benutze außerdem SDL1.2 (jaja, Schande über mich :D)

Sieht jemand das Problem? Wenn ihr noch mehr Quellcode braucht kann ich den auch komplett reinstellen (ca 2000 Zeilen).

Ich bedanke mich schonmal für eure Hilfe!

MfG Khodos
Aktuelles Projekt: World of Kienz

2

28.03.2015, 12:52

Du versuchst eine ungültigen CSpieler-Zeiger, der auf 0 zeigt, zu benutzen ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

28.03.2015, 13:24

Wahlweise ein TTF_Init vergessen. Ich glaub' da passiert das ebenfalls.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

4

28.03.2015, 13:39

Müsste bei einem Nullpointer-Zugriff die Zugriffsverletzung nicht beim Lesen an Position 0x00000000 entstehen?

5

28.03.2015, 13:49

Die Member sind ja nicht alle an einer Adresse, sonder liegen hintereinander im Speicher. Hast du nun eine pointer, der die adresse 0x03009001 enthält und versuchst einen member, der z.B das offset 4 innerhalb der klasse hat, zu lesen, dann wird ein speicherblock von adresse 0x03009005 gelesen.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

6

28.03.2015, 16:11

Und hier war der Offset 8 Byte oder wie?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

28.03.2015, 16:21

Offenbar.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

8

28.03.2015, 16:49

Ok, danke, gut zu wissen :)

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

9

28.03.2015, 17:00

Danke für die schnellen Antworten!
Was mir komisch vorkommt: Wenn es an den leeren CSpieler-Zeiger liegt, warum funktioniert dann alles die ersten Minuten ohne Probleme und stürzt dann erst ab? Ich meine das wird ja alles mehrmals pro Sekunde aufgerufen und aktuallisiert, ich hab keine Funktion dabei, die erst nach einer gewissen Zeit aufgerufen wird. Warum läuft das alles dann 1000x normal und stürzt dann plötzlich ab? Wenn daran liegt müsstes ja eigentlich gleich beim 1. mal Aufrufen den Fehler verursachen, oder seh ich das falsch?

Ich hab außerdem jetzt mal alle Anzeigen, die wie oben im Quelltext gezeigt eine int-Zahl auf den Bildschirm ausgeben, auskommentiert. Seit dem läuft das ganze Programm jetzt schon ne halbe Stunde ohne Probleme. Kennt vielleicht jemand noch ne andere Methode int-Variablen in ein const char* umzuwandeln?

EDIT: Mir ist grad aufgefallen das ich auch die Lebenspunkte der Gegner mit der selben Methode ausgebe, dabei gibts keine Fehler, scheint also doch an CSpieler zu liegen...
Aktuelles Projekt: World of Kienz

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Khodos« (28.03.2015, 17:08)


birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

28.03.2015, 17:31

Ich seh da ein Problem bei dir. Meines Wissens nach ist energiestream.str() temporär und wird bei beenden der funktion gelöscht, damit ist dein übergebener pointer dann ungültig.
Du solltest den Weg über einen string nehmen:

C-/C++-Quelltext

1
2
3
4
5
std::stringstream energiestream;
energiestream << energie; //energie ist int
std::string energiestring = energiestream.str();
textenergie = TTF_RenderText_Solid (font, energiestring.c_str(), colorwhite);
setimage (180.0f, 691.0f, textenergie->h, textenergie->w, textenergie, screen);

Werbeanzeige