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

02.08.2015, 19:44

Ausnahmefehler bei SDL_Game.exe | Listing 12.xx

Hallo,

ich befinde mich derzeit bei Listing 12.xx, also bei der Erstellung des Weltraumshooters. Wenn ich es aber starten will kommt ein Ausnahmefehler (siehe Anhang). Bevor dieser Fehler erscheint läd er allerdings den Hintergrund sowie auch das Raumschiff selbst und auch nur wenn ich es mit F5 starte, bei Strg+F5 läd es ebenfalls den Hintergrund und das Raumschiff und haut mir dann aber eine Windowsfehlemeldung um die Ohren "SDL_Game.exe funktioniert nicht richtig"

VS13 zeigt mir keine Fehler oder Wahrnungen an und konnte bei google auch keine Lösung finden -.-

lg
»Epiphany99« hat folgendes Bild angehängt:
  • Fehler-SDL_Game.PNG

2

02.08.2015, 23:15

http://stackoverflow.com/questions/12738…representations
Du greifst über einen uninitialisierten Zeiger auf Daten zu.

3

03.08.2015, 07:28

Guten Morgen!

Erstmal danke für die Antwort! Mich hat das keine Ruhe gelassen und hab mich heute Früh vor der Arbeit nochmal
rangesetzt und konnte den Fehler finden:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//Asteroid.hpp
//
class CAsteroid
{
    public:
        void Init               (CSprite *pSpriteAsteroid, float fXPos, float fYPos);
        void Update         ();
        void Render         ();
        bool IsAlive            () {return m_bIsAlive;}
        void SetAlive           (bool bIsAlive) {m_bIsAlive = bIsAlive;}
        SDL_Rect GetRect    () {return m_Rect;}

    private:
        CSprite *pSpriteAsteroid;   // Zeiger auf Asteroiden-Sprite
        float   m_fXPos;              // X-Position des Asteroiden
        float   m_fYPos;              // Y-Position des Asteroiden
        float   m_fAnimPhase;      // Akt. Animationsphase des Asteroiden
        bool    m_bIsAlive;          // "Lebt" der Asteroid noch?
        SDL_Rect m_Rect;            // Rect des Asteroiden
 
};

//Asteroid.cpp
void CAsteroid::Init (CSprite *pSpriteAsteroid, float fXPos, float fYPos)
{
    // Zeiger auf Sprite kopieren und Koordinaten setzen
    pSpriteAsteroid = pSpriteAsteroid;
    m_fXPos = fXPos;
    m_fYPos = fYPos;

    // Animation beginnt beim ersten Einzelbild
    m_fAnimPhase = 0.0f;

    // Rect initialisieren
    m_Rect.x = static_cast<int>(fXPos);
    m_Rect.y = static_cast<int>(fYPos);
    m_Rect.w = pSpriteAsteroid->GetRect().w;
    m_Rect.h = pSpriteAsteroid->GetRect().h;

    // Asteroid aktivieren
    m_bIsAlive = true;

} // Init


Fehler: Zeile 14 und 27

Somit wollte die Funktion wohl auf nen privaten Zeiger zugreifen. Warum dann aber keine Fehlermeldung/Warnung
in VS13 angezeigt wurde, bleibt mir ein Rätsel. Hat das was damit zu tun, dass es ein Zeiger is?
Aber sollte dann nicht die Adresse privat sein ?(

Nachdem ich das bereinigt habe, konnte ich endlich das Spiel starten und verschoss schöne große, violette, rechteckige Laser :)
Diesen Fehler konnte ich aber recht schnell finden ^^

Danach wollte ich die exe-datei auf Dropbox laden um auch auf anderen Rechnern Zugriff darauf zu haben. Beim Versuch die
Datei zu öffnen schrie er nach der SDL.dll Datei, die ich dann auch in den Ordner kopierte. Jetzt kam zwar keine Fehlermeldung mehr
aber er startet das Spiel nicht über die exe, über VS geht noch immer alles.
Nun zu meiner Frage, was ist diese SDL.dll Datei überhaupt, ist das quasi die Datei wo alle für den Code benötigten SDL Funktionen
gespeichert werden? Und wie kann ich nun die exe auf anderen Rechnern zum Laufen bringen? Oder muss ich immer alle .hpp und .cpp
Dateien zur Verfügung stellen, dass kann ich mir aber auch nicht vorstellen... weil dann könnte man es ja nur mit ner
Entwicklungsumgebung aufmachen... :hmm:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

03.08.2015, 10:01

Mach für die letzte Frage bitte ein separates Thema auf.
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]

5

03.08.2015, 12:01

Ok, wollte nur a bissl Threads sparen ^^

6

03.08.2015, 19:06

Init-Methoden sind übrigens absolut doof. Dafür ist der Konstruktor da. m_bIsAlive sollte auch weg, entweder existiert das Objekt oder eben nicht. Ich denke mal, dass du zum speichern der Asteroiden ein statisches Array, benutzt; benutze lieber einen Container wie std::vector oder std::list, dann kannst du soviele Asteroiden haben, wie du willst, jedenfalls theoretisch ;)

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

7

04.08.2015, 03:38

Init-Methoden sind übrigens absolut doof.


Wenn ich jetzt aber eine Spieleszene habe und ein Objekt muss auf andere zugreifen, sollte es das nicht in einer Init-Methode machen, bei deren Aufruf sicher ist, dass alle Objekte schon erzeugt wurden?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

04.08.2015, 06:28

Wenn wirklich Dinge nachträglich nach der Konstruktion gemacht werden müssen, dann sollte das kein "init" sein. Init besagt, dass das Objekt bisher nicht initialisiert wurde. Dafür ist aber der Konstruktor da.
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]

9

04.08.2015, 06:51

Init-Methoden sind übrigens absolut doof. Dafür ist der Konstruktor da. m_bIsAlive sollte auch weg, entweder existiert das Objekt oder eben nicht. Ich denke mal, dass du zum speichern der Asteroiden ein statisches Array, benutzt; benutze lieber einen Container wie std::vector oder std::list, dann kannst du soviele Asteroiden haben, wie du willst, jedenfalls theoretisch ;)
Die Asteroiden werden in ne Liste gepackt, wenn sie vom Laser getroffen werden, wird bIsAlive auf false gesetzt. Danach werden alle die nicht mehr leben aus der Liste wieder entfernt :)

Des heißt also, man könnte/sollte einfach die Init Funktion durch den Konstruktor ersetzen und ihm die ganze Parameterliste ergeben und ihn einfach so verwenden wie die Init-Funktion?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

04.08.2015, 06:57

Das kommt wohl darauf an, ob die Init-Methode auch später nochmal aufgerufen wird. Da wäre es entweder sinnvoll die Init in Reset umzubenennen oder sie ganz wegzuwerfen und einen neuen Asteroiden zu erzeugen, wenn man einen neuen braucht.
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]

Werbeanzeige