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

08.07.2008, 18:25

Programm Unnachvollziehbare Fehler..

Hi,

Ich hab ein wirklich verzwigtes Problem.. Ich arbeite an einem 2D Projekt und benutze die SDL.

Nun bekomme ich aber unerklärliche und wirklich misteriöse Probleme, wenn ich versuche eine Klasse zu verwenden.

Z.b wird im Header einer Klasse eine Instanz eben dieser problematischen Klasse gebildet. Soweit so gut -> Das Programm läuft ohne Fehler..
Wenn ich nun follgendes in einer Funktion probiere:

C-/C++-Quelltext

1
2
            //m_DamObjBeat.Init(991,1037,500, 526, 29,46, "Data/Grafics/DamageObjectsDOWN/Flower.bmp", 1600,400,150,true);

            //m_lDamageObjBeat.push_back(m_DamObjBeat);


Startet die SDL nicht mehr.. Das wirklich misteriöse ist, dass wenn ich den Uhrsprungszustand "also ohne diese Zeilen" wieder herstelle, dass Projekt auch nicht mehr startet "BIldschirm geht auf und sofort wieder zu ohne etwas anzuzeigen" auch der Debugger bricht sofort mit einer Fehlermeldung ab, wenn ich ihn versuche zu benuzen:

Ungültige Ausnahme in "Project_Name.exe" 0xC000000 Acces Violation heißt es dann..

Ich kann nichts weiter machen, als das letzte Backup des Projekts wieder zu laden weil auch, dass Rückgängig machen aller gemachten Codeänderungen bringen keine Verbesserung..

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

08.07.2008, 18:31

Einfach so lässt sich auch nichts dazu sagen.

Zeig mal mehr Code der Klasse, wo du den Fehler vermutest.

Zeig mal wo der Debugger dir diesen Fehler gibt (und die Abhängigkeiten des Objektes, das da Probleme macht).

Um mich mal in meinen magischen Fähigkeiten zu üben, sage ich einfach mal, dass du da einen Zeiger auf ein Objekt hast, dass gar nicht(mehr) existiert.
Weil du da anscheinend ein Objekt in eine Liste pusht. Wenn du jetzt da irgendwo vorher einen Zeiger von dem Objekt genommen hast, dann ist der Fehler da.

3

08.07.2008, 18:51

Okey hier ist erstmal der Header der Klasse, welche Probleme macht:

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
#ifndef DAMAGEOBJECTBEATER_HPP
#define DAMAGEOBJECTBEATER_HPP

#include "AreaScanning.hpp"

class CDamgeObjectBeater : public CAreaScanning
{

    public:
    void Init (int Oben, int Unten,int Links, int Rechts, int Width,int Height, string Graficlink, int GroundStay, int Overgroundstay, int Movespeed, bool Flower);
    void Ubdate(CPlayer &Player);
    void Render (CPlayer &Player);
    void DamageScanning(CPlayer &Player);
    void Abfrage_Unten (CPlayer &Playerwerte);

    private:
    CSprite m_DamObjUPGrafic;
    int m_MoveStatus;
    int m_width;
    int m_height;
    int m_Speed;

    int m_Posiadd;
    int m_Posicount;
    float m_fPosiadd;

    int m_GroundStay;
    int m_OverGroundStay;

    int m_Damagezone;

    bool m_bFlower;

};

#endif


Und hier die Init Funktion die ich Aufrufe um die Werte zu initaliesieren:

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
//Init

//

//Aufgabe: Kollisonskoordinaten der Area Instanz initaliesieren

//

void CDamgeObjectBeater :: Init (int Oben, int Unten,int Links, int Rechts, int Width,int Height, string Graficlink, int GroundStay, int Overgroundstay, int Movespeed, bool Flower)
{


    m_fYOben = Oben;//Speichert,  Y Wert oben des Objektes

    m_fYUnten = Unten;//Speichert,   Y Wert unten des Objektes

    m_fXLinks = Links; //Speichert,  X Wert Links des Objektes

    m_fXRechts = Rechts;  //Speichert, X Wert Rechts des Objektes


    m_width = Width;
    m_height = Height;
    m_MoveStatus = 1;
    m_DamObjUPGrafic.Load_DamageObject_DOWN(Graficlink, m_width, m_height); 
    m_DamObjUPGrafic.SetColorKey(255,0,255);

    m_Posiadd = 0;
    m_fPosiadd = 0;
    m_Posicount = 0;
    m_Damagezone = 0;

    
    m_GroundStay = GroundStay;
    m_OverGroundStay = Overgroundstay;
    m_Speed = Movespeed;

    m_bFlower = Flower;

}



Hier ist der Header der Klasse die eine Instanz der Problematischen Klasse enthält

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#ifndef Game_HPP
#define Game_HPP
#include <list>
#include "framework.hpp"
#include "Player.hpp"
#include "Enemy.hpp"
#include "Enemy_Rex.hpp"
#include "AreaScanning.hpp"
#include "Backgroundmap.hpp"
#include "Enemy_hotDinosaur.hpp"
#include"FireShot.hpp"
#include "AreaMoveObject.hpp"
#include "DamageObjectUP.hpp"
#include "DamageObjectDown.hpp"
#include "DamageObjectBeater.hpp"

class CGame
{
public:

    CGame();

    //Hauptfunktionen des Spiels

    void Run ();
    void Exit ();

    //Unterfunktionen von Run

    void Testlevel();
    

    //Funktionen für Level

    void AreaAbfragen ();
    
    void EnemyUbdate ();
    void EnemyRendern ();
    void EnemyAreaScanning();

    void AreaStagesUbdate();
    void AreaStagesRender();

    void DamageObjectsUbdate ();
    void DamageObjectsRender ();
    void DamageObjectsScanning ();



private:
    
    //Instanzen

    CPlayer m_Player; //Für Spieler

    CBackgroundmap *m_Backgroundmap;
    CEnemy_Rex  m_Enemy;
    CEnemy_HotDinosaur m_Enemy2;
    CFireShot m_Fire_Mario;

    //-------------------------------

    CDamgeObjectBeater m_DamObjBeat;
    //------------------------------

    
    CDamgeObjectUP m_DamObjUP;
    CDamgeObjectDown m_DamObjDown;
    


    
    
    CAreaMoveObject m_Stage;


    //Listen

    list<CAreaScanning> m_lArea; //Liste für Area

    list<CAreaMoveObject> m_lStage; //Liste für Platformen

    list<CDamgeObjectUP> m_lDamageObjUP; //UP

    list<CDamgeObjectDown> m_lDamageObjDown; //DOWN


    //-----------------------------------------------------

    list<CDamgeObjectBeater> m_lDamageObjBeat; //Beater

    //-----------------------------------------------------




    list<CEnemy> m_lEnemy; //Liste für Gegner

    list<CEnemy_HotDinosaur> m_lEnemy2; // Liste für Spezialfall Feuerdino

    


    //Variablen

    bool m_bContact; //Speichert ob Spielerbodenkontakt hat

    bool m_bListe; //Speichert ob Liste schon gefüllt wurde..

    bool m_bAfterFall; //Speichert ob es nach dem Fall ist



    
};

#endif


Und hier ist die Funktion, in der die Instanz in eine Liste geschoben werden soll, was ja den oben geschilderten Effekt hat..





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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
void CGame::Testlevel ()
{
    

    if (m_bListe == false)
    {
            CAreaScanning m_Area; //Für Objekte

            m_Area.Init(1136,0,0,3000);
            m_lArea.push_back(m_Area);
            m_Area.Init(1078,1136,691,717);
            m_lArea.push_back(m_Area);
            m_Area.Init(1042,1052,754,850);
            m_lArea.push_back(m_Area);
            m_Area.Init(1000,1010,886,982);
            m_lArea.push_back(m_Area);
            m_Area.Init(953,962,1013,1110);
            m_lArea.push_back(m_Area);
            m_Area.Init(895,905,1171,1267);
            m_lArea.push_back(m_Area);
            m_Area.Init(806,815,1115,1211);
            m_lArea.push_back(m_Area);
            m_Area.Init(746,755,1277,1374);
            m_lArea.push_back(m_Area);

        
            if(1 == 2)
            {

            m_Enemy.Init(200,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(300,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(400,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(500,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(550,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(355,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(370,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(455,1090,100,100);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(478,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(201,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(278,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(456,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(399,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(388,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(201,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(178,1090,60,60);
            m_lEnemy.push_back(m_Enemy);
            m_Enemy.Init(199,1090,60,60);
            m_lEnemy.push_back(m_Enemy);

            }
    


    
    

            if(1== 2)
            {
            m_Enemy2.Init(1130,1112,150,150);
            m_lEnemy2.push_back(m_Enemy2);
            m_Enemy2.Init(1430,1112,150,150);
            m_lEnemy2.push_back(m_Enemy2);
            m_Enemy2.Init(1340,1112,150,150);
            m_lEnemy2.push_back(m_Enemy2);
            m_Enemy2.Init(1250,1112,150,150);
            m_lEnemy2.push_back(m_Enemy2);
            m_Enemy2.Init(1190,1112,150,150);
            m_lEnemy2.push_back(m_Enemy2);  

            }
        
    
        
            m_Stage.Init(700,711,1580,1676,100,2,1,100,"Data/Grafics/MoveObjects/stage_normal.bmp");
            m_lStage.push_back(m_Stage);
            m_Stage.Init(700,711,1930,2026,100,1,1,100,"Data/Grafics/MoveObjects/stage_normal.bmp");
            m_lStage.push_back(m_Stage);

            m_DamObjUP.Init(1090,1136,600, 626, 29,46, "Data/Grafics/DamageObjectsUP/Flower.bmp", 1000,400,150,true);
            m_lDamageObjUP.push_back(m_DamObjUP);
            m_DamObjUP.Init(1090,1136,500, 526, 29,46, "Data/Grafics/DamageObjectsUP/Flower.bmp", 1200,400,150,true);
            m_lDamageObjUP.push_back(m_DamObjUP);
            m_DamObjUP.Init(1090,1136,400, 426, 29,46, "Data/Grafics/DamageObjectsUP/Flower.bmp", 1400,400,150,true);
            m_lDamageObjUP.push_back(m_DamObjUP);
            m_DamObjUP.Init(1090,1136,300, 326, 29,46, "Data/Grafics/DamageObjectsUP/Flower.bmp", 1600,400,150,true);
            m_lDamageObjUP.push_back(m_DamObjUP);

            m_DamObjDown.Init(1091,1137,500, 526, 29,46, "Data/Grafics/DamageObjectsDOWN/Flower.bmp", 1600,400,150,true);
            m_lDamageObjDown.push_back(m_DamObjDown);

            //-------------------------------------------------------------------------------------------------------

            m_DamObjBeat.Init(991,1037,500, 526, 29,46, "Data/Grafics/DamageObjectsDOWN/Flower.bmp", 1600,400,150,true);
            m_lDamageObjBeat.push_back(m_DamObjBeat);
            //----------------------------------------------------------------------------------------------------------

            
            m_bListe = true;

                
    }



Ich hab versucht die Entscheidenden Zeilen die die problematische Klasse betreffen durch Kommentarzeilen etwas hervorzuheben ;)

Der gelbe Debuggerpfeil stand an follgender Stelle als die Fehlermeldung kam:



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main (int argc, char *argv[])
{
    // Framework initialisieren 

    if (g_pFramework->Init (800, 600, 16, false) == false)
    return (0);

    g_pLogfile->CreateLogfile("Logfile.html");
    
       Hier war der Pfeil->CGame Game;
    
    for (int i = 0; i<10000; i++)
    {

        Game.Run();
    }

    return (0);

}

4

08.07.2008, 20:04

Okey also wenn ich die Klassendeklaration im Header wieder komplett rauslösche dann funktioniert das Programm... Es muss also irgendwie an der Klasse liegen

edit von unsigned long: man quoted keinen kompletten Quelltext. Den schaut sich so erst recht kein Mensch an und jegliche Hilfe für dich bleibt auf der Strecke. Wenn dann änderst du deinen ersten Post ab.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

08.07.2008, 20:07

Mach an die besagte Stelle einen Breakpoint, und geh schrittweise durch bis es knallt.
@D13_Dreinig

Viktor

Alter Hase

Beiträge: 533

Wohnort: Ludwigshafen

Beruf: Student

  • Private Nachricht senden

6

08.07.2008, 21:45

C-/C++-Quelltext

1
2
3
4
void CGame::Testlevel () 
...
if(1 == 2)
...


:? Was soll das denn? :?
Wie soll 1 jemals gleich 2 sein ?
Den Sinn musst du mir nochmal erklären....

7

09.07.2008, 09:03

Ich find es toll, den ganzen Quelltext als Zitat wieder einzubinden und dann nur einen Satz hinzufuegen. Der hat ja noch nicht mal richtig was mit dem Quelltext zu tun. :-( Desweiteren: Was ist denn mit der Klasse CSprite? Desweiteren weiss ich nicht wie es sich mit impliziten Typumwandlungen von char* zu string verhaelt.

8

13.07.2008, 13:42

Boa is dasn Kot von Code ;) Ehm Guckste Initialisierungsliste, const, unsigned, const-Ref tjo und Init und Exit, so gern se David auch in seiner TriBase Engine verwendet hat, sind SCHEI?E! Konstruktor und Destruktor rulez!
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

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

9

13.07.2008, 14:04

Zitat von »"Deviloper"«

Boa is dasn Kot von Code ;) Ehm Guckste Initialisierungsliste, const, unsigned, const-Ref tjo und Init und Exit, so gern se David auch in seiner TriBase Engine verwendet hat, sind SCHEI?E! Konstruktor und Destruktor rulez!


Naja es gibt durchaus Fälle in denen Init und Exit mal recht hilfreich sein können.

C-/C++-Quelltext

1
void Ubdate(CPlayer &Player); 

Auch eine sehr bayrische Schreibweise :)

Abcd1234:
Wenn du uns den ganzen Quellcode zeigst, wird sich kaum jemand die Mühe machen ihn wirklich durchzulesen; du musst die wesentlichen fehlerstellen herausfinden und uns diese dann mitteilen...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

13.07.2008, 14:04

Zitat von »"Deviloper"«

tjo und Init und Exit, so gern se David auch in seiner TriBase Engine verwendet hat, sind SCHEI?E! Konstruktor und Destruktor rulez!


Das kann man aber auch nicht so global sagen. Zum Teil will ich Objekte gar nicht komplett Initialisieren wenn ich sie konstruiere. Dann sind "Init" und "Exit" Methoden extrem Sinnvoll.
@D13_Dreinig

Werbeanzeige