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

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

1

21.04.2011, 15:24

[C++] Multiinstanzen Problem

Habe ein Kleines Multiinstanzen Problem, er sagt mir immer so einen andressen fehler das irgendwas nicht lesen konnte.

Zitat

Unbehandelte Ausnahme bei 0x00571013 in Soldier.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000018.
Also das problem kam auch erst nachdem ich das mit dem Multiinstanz probiert habe, wüsste nicht was daran falsch wäre.

Der Code:
main.ccp

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
114
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include "ammo.h";
#include "player.h";
#include "collision.h";
#include "ground.h";

using namespace std;

int iWindowW = 800;
int iWindowH = 600;
sf::RenderWindow App(sf::VideoMode(iWindowW, iWindowH, 32), "Soldier Map");
sf::View Camera;

template<class T> inline std::string toStr(T x)
{
    std::stringstream type;
    type << x;
    return type.str();
};

int main()
{
    Player MyPlayer;
    MyPlayer.Create();


    Camera.SetCenter(App.GetDefaultView().GetCenter());

    sf::Image iCursor;

    iCursor.LoadFromFile("data/cursor.bmp");
    iCursor.CreateMaskFromColor(sf::Color(192,208,2));
    iCursor.SetSmooth(false);

    sf::Sprite Cursor(iCursor);
    App.ShowMouseCursor(false);

    int GroundLong = 4;
    int PP = 0;
    Ground *Object=NULL;
    Object = new Ground[4];
    for(int i = 0;i <= 4;i++){
        Object[i].Create(PP,-80);
        PP = PP + 80;
    }

    while (App.IsOpened())
    {
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if ((Event.Type == sf::Event::Closed) || ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape)))
            {
                App.Close();
                break;
            }
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::F1)){
                //Hilfe
            }
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::F2))
            {
                sf::Image Screen = App.Capture();
                Screen.SaveToFile("screenshot.jpg");
            }
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::F3))
            {
                // zu player setzen
            }
            if(App.GetInput().IsMouseButtonDown(sf::Mouse::Left)){

            }
        }

        MyPlayer.PlayerS.Move(0,1);

        float ElapsedTime = App.GetFrameTime();

        if (App.GetInput().IsKeyDown(sf::Key::Left)){ Camera.Move(-5,0); }
        if (App.GetInput().IsKeyDown(sf::Key::Right)){ Camera.Move(5,0); }
        if (App.GetInput().IsKeyDown(sf::Key::Up)){ Camera.Move(0,-5); }
        if (App.GetInput().IsKeyDown(sf::Key::Down)){ Camera.Move(0,5); }

        if (App.GetInput().IsKeyDown(sf::Key::A)){ MyPlayer.MoveLeft(1); }
        if (App.GetInput().IsKeyDown(sf::Key::D)){ MyPlayer.MoveRight(1);  }
        if (App.GetInput().IsKeyDown(sf::Key::W)){  }
        if (App.GetInput().IsKeyDown(sf::Key::S)){  }

        App.Clear(sf::Color(32,64,64));

        float iCursorX = Cursor.GetSize().x / 2;
        float iCursorY = Cursor.GetSize().y / 2;

        Cursor.SetPosition(App.ConvertCoords(App.GetInput().GetMouseX()-iCursorX, App.GetInput().GetMouseY()-iCursorY));
        
        App.SetView(Camera);


        for(int i = 0;i <= 4;i++){
            App.Draw(Object[i].GroundS);
            if(Collision::BoundingBoxTest(MyPlayer.PlayerS, Object[i].GroundS)){
                MyPlayer.PlayerS.Move(0,-1);    
            }   
        }

        App.Draw(Cursor);
        App.Draw(MyPlayer.PlayerS);

        App.Display();
    }

    return EXIT_SUCCESS;
}

ground.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <SFML/Graphics.hpp>
#include "ground.h"

Ground::~Ground(void)
{

}

void Ground::Create(float X,float Y)
{
    GroundImage.LoadFromFile("data/ground.bmp");
    GroundImage.CreateMaskFromColor(sf::Color(192,208,2));
    GroundImage.SetSmooth(false);
    GroundS.SetImage(GroundImage);
    GroundS.Move(X,Y);
}

ground.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <SFML/Graphics.hpp>
 
class Ground
{
public:
    sf::Image GroundImage;
    sf::Sprite GroundS;
 
public:
    ~Ground(void);
 
    void Create(float,float);
    
};

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

2

21.04.2011, 15:33

Wo tritt der Fehler denn auf?

3

21.04.2011, 15:39

Hi!

Das Problem rührt daher, dass du auf ein Element im Array zugreifst das es nicht gibt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
Ground *Object=NULL;     
Object = new Ground[4];

for(int i = 0;i <= 4;i++)
{         
// Wenn 'i' gleich 4 ist, wird auf das 5te Element im Array zugegriffen, welches nicht vorhanden ist und es somit zu 
// einer Violation kommt.
   Object[i].Create(PP,-80);
   PP = PP + 80;     
}


Ändere deine Schleife so ab das er nicht auf ein Element außerhalb des Arrays zugreifen probiert.
Die Abbruchbedingung muss i<4 lauten damit es funktioniert.

so long
chris

4

21.04.2011, 15:39

Ich würde mal behaupten der Fehler tritt hier auf:

C-/C++-Quelltext

1
2
3
Object = new Ground[4];
for(int i = 0;i <= 4;i++) 
{ ... }


Du hast ein Array, dass 4 Zeiger speichern kann. Du willst aber in deiner for-Schleife 5 Objekte erzeugen und Zeiger darauf im Array speichern. Von 0 bis einschließlich 4 - das macht 5. Mach aus dem Kleiner-Gleich ein Echt-Kleiner.

Ach ja und unten beim Rendern machst du selbiges noch einmal.

*EDIT*: Zu langsam... GDChris war schneller...

Gruß
SaRu_

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

5

21.04.2011, 15:39

Also ab dem hinzufügen der zeilen
40-47
100-105
Ab dann kam der Fehler.

//EDIT danke SaRu hätte mir einfallen müssen ich schua mal aubs geht :S

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

21.04.2011, 15:40

Die Frage von MCP kann man auch so formulieren:
Es gibt etwas, das nennt sich "Debugger". Es funktioniert. Es ist hilfreich. Es ist mächtig.
Es wäre eventuell hilfreich, wenn Du diesen benutzen könntest und den Fehler auf eine spezielle Zeile eingrenzt.
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]

AyJay

Frischling

  • »AyJay« ist der Autor dieses Themas

Beiträge: 67

Beruf: Schule, Hobbys :D

  • Private Nachricht senden

7

21.04.2011, 15:43

Naja es geht. Danke SaRu kann geclosed werden :).

C-/C++-Quelltext

1
2
3
While(!asleep){
    sheep++;
}

Werbeanzeige