Unbehandelte Ausnahme - Header- & CPP-Datei
-
Hast du es debuggt? In welcher Zeile tritt er auf? Der Debugger sollte dir eigentlich die Zeile angeben.
-
carliman1412 schrieb:
Unbehandelte Ausnahme bei 0x776ff592 in TheHelicopter.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000004.0x00000004 ist verdächtig nahe an 0x00000000. Du hantierst irgendwo mit Pointern, einer davon ist ein Nullzeiger.
Code für die CPP-Datei (hier wird der Fehler mit einem grünen Pfeil angezeigt):
Den grünen Pfeil hast du wohl leider vergessen.
Die eigentliche Ursache wird bei dieser Art Fehler ohnehin ganz woanders sein. Lies mal den dritten Link in meiner Signatur, wie du dein Programm auf ein Minimalbeispiel reduzieren kannst, an dem wir den Fehler nachvollziehen können.
-
daddy_felix schrieb:
kommentiere mal ganz viel aus - bis die Fehlermeldung nicht mehr erscheint. Dann nimmst du den Code Stück für Stück wieder rein. So solltest du die fehlerhafte Stelle finden.
Hmm, ich würde da eher Check-Points setzen - nach jedem Statement ein
std::cout << "CHECK!\n";(vielleicht mit Makro), und dann zählen
Auskommentieren kann ja zu anderen Fehlern führen, die nur weiter Verwirrung stiften. (Oder?)
-
daddy_felix schrieb:
carliman1412 schrieb:
Es würde mich sehr freuen wenn ihr mir da weiter helfen könntet

kommentiere mal ganz viel aus - bis die Fehlermeldung nicht mehr erscheint. Dann nimmst du den Code Stück für Stück wieder rein. So solltest du die fehlerhafte Stelle finden.
Btw: Was ist "sf::String"? Bietet der irgendwelche Vorteile gegenüber std::string?
Das auskommentieren hab ich ausprobiert. Sobald ich den Konstruktor schreibe gibt es die Fehlermeldung. Ich habe auch schon sf::string durch std::string ersetzt, hat aber nichts geholfen. Trotzdem Danke
-
Sone schrieb:
Hast du es debuggt? In welcher Zeile tritt er auf? Der Debugger sollte dir eigentlich die Zeile angeben.
Der Fehler tritt in der 4. Zeile auf. Also bei der geöffneten Klammer im Konstruktor
-
carliman1412 schrieb:
Sone schrieb:
Hast du es debuggt? In welcher Zeile tritt er auf? Der Debugger sollte dir eigentlich die Zeile angeben.
Der Fehler tritt in der 4. Zeile auf. Also bei der geöffneten Klammer im Konstruktor
wtf...
Ist das ein Fehler in der Initialisierung des Strings? Wie rufst du den Ctor auf? Zeig mal.
-
Sone schrieb:
carliman1412 schrieb:
Sone schrieb:
Hast du es debuggt? In welcher Zeile tritt er auf? Der Debugger sollte dir eigentlich die Zeile angeben.
Der Fehler tritt in der 4. Zeile auf. Also bei der geöffneten Klammer im Konstruktor
wtf...
Ist das ein Fehler in der Initialisierung des Strings? Wie rufst du den Ctor auf? Zeig mal.Sorry. Ich meinte geschweifte Klammer auf.
-
So rufe ich den Konstruktor in der main.cpp auf:
Object object("/img/objects.png");
-
zeig doch mal die gesamte main.cpp
-
carliman1412 schrieb:
Sorry. Ich meinte geschweifte Klammer auf.
Das hat Sone schon verstanden. Ich wiederhole noch einmal: Der Fehler liegt ganz, ganz woanders. Eventuell sogar in sf::string. Was ist das überhaupt? Falls das eine Eigenkreation sein sollte, dann darfst du aus obigem "eventuell" ein "mit absoluter Sicherheit" machen.
Zeig uns ein vollständiges Beispiel. Nochmal: Dritter Link in meiner Signatur. Du willst Hilfe. Wenn du uns Ratespielchen spielen lässt, liest in einer Stunde niemand mehr deine Threads.
-
sf::String ist von SFML und bietet automatische Unicode-Konvertierung, soweit ich weiß.
-
Wie wärs mal mit einem Debugger und einem Stacktrace? Dann müsstest du nicht mehr weiter rätselraten...
-
Hast du mal versucht in der Main das so aufzurufen?:
sf::string blub("deinPfad");
Object obj(blub);Kann mich da schwach erinnern das da so was war... weiß aber nicht ob es das war

PS: Zeig mal bitte wie du den in der Header deklariert hast

-
Nathan schrieb:
sf::String ist von SFML und bietet automatische Unicode-Konvertierung, soweit ich weiß.
Nicht ganz richtig. ein sf::String ist ein gerenderter String auf dem Bildschirm. Das hat mit std::string garnichts zu tun, weil std::string nur Zeichenketten speichert und sie nicht mit einem Font auf eine Textur rendern kann ...
Ist also extrem schwachsinnig hier sf::String zu verwenden und das ganze funktioniert auch nur, weil sf::String implizit von std::string/char const* erzeugt werden kann und gecastet wird. Denn die Signatur von Texture::loadFromFile ist:
bool loadFromFile (const std::string &filename, const IntRect &area=IntRect())Edit: Okay, seit Version 2.0 ist sf::String wirklich eine Stringklasse und die Renderklasse heißt sf::Text ... sorry.
-
Header-Datei:
#include <SFML\Graphics.hpp> using namespace sf; class Object { public: void Update(RenderWindow &window, float elapsedTime); void Render(RenderWindow &window); Object(sf::String tex); private: float speed; Texture texture; Sprite sprite; bool active; };min.cpp:
#include <iostream> #include <windows.h> #include <random> #include <string> #include <vector> #include "object.h" #include <SFML/Graphics.hpp> using namespace sf; //Variables int winX=1024; int winY=700; bool running=true; bool started=true; bool spaceStarted=false; int imgID=0; int posX=80; int posY=winY/2; float accY=0; int life=100; Clock clock1; Object object("/img/objects.png"); //voids void restartGame(); void resetVariables(); int main() { //Window RenderWindow window(VideoMode(winX, winY, 32), "TheHelicopter", Style::Close); window.setFramerateLimit(100); std::cout << "loaded window" << std::endl; //--------Spawn-Timer-------- //---------------- //--------Object-List-------- //---------------- //--------Fonts-------- Font agency; agency.loadFromFile("AGENCYR.TTF"); std::cout << "loaded fonts" << std::endl; //---------------- //--------Background-------- Texture texBackground; texBackground.loadFromFile("img/background.png"); Sprite sprBackground; sprBackground.setTexture(texBackground); sprBackground.setPosition(0, 0); sprBackground.setScale(17.5, 17.5); std::cout << "loaded background" << std::endl; //---------------- //--------Player-------- Texture texPlayers; texPlayers.loadFromFile("img/players.png"); Sprite sprPlayer; sprPlayer.setTexture(texPlayers); sprPlayer.setTextureRect(IntRect(0, imgID*40, 120, imgID*20+40)); sprPlayer.setOrigin(60,20); sprPlayer.setScale(1, 1); sprPlayer.setPosition(posX, posY); std::cout << "loaded player" << std::endl; //---------------- //--------Player-Life-Bar-------- Texture texBarBack; Texture texBar; texBarBack.loadFromFile("img/bar.png"); texBar.loadFromFile("img/bar.png"); Sprite sprBarBack; Sprite sprBar; sprBarBack.setTexture(texBarBack); sprBar.setTexture(texBar); sprBarBack.setTextureRect(IntRect(0, 0, 100, 5)); sprBar.setTextureRect(IntRect(0, 5, life, 10)); sprBarBack.setOrigin(50, 3); sprBar.setOrigin(50, 3); std::cout << "loaded player-life-bar" << std::endl; //---------------- //--------Object-------- //---------------- //--------Text-------- Text txtStart("Press Space to start!", agency, 100); txtStart.setColor(Color(128,128,128)); txtStart.setOrigin(txtStart.getLocalBounds().width/2, txtStart.getLocalBounds().height/2); txtStart.setPosition(winX/2,winY/2); std::cout << "loaded text" << std::endl; //---------------- std::cout << "game started" << std::endl; while(running) { Event event; float elapsedTime=clock1.restart().asMilliseconds(); while(window.pollEvent(event)) { if(((event.type==Event::KeyPressed) && (event.key.code==Keyboard::Escape)) || event.type==Event::Closed) { running=false; } } while(!spaceStarted) { if(Keyboard::isKeyPressed(Keyboard::Space)) { spaceStarted=true; std::cout << "space pressed" << std::endl; } while(window.pollEvent(event)) { if(((event.type==Event::KeyPressed) && (event.key.code==Keyboard::Escape)) || event.type==Event::Closed) { spaceStarted=true; running=false; } } window.clear(Color(2, 0, 10)); window.draw(sprBackground); window.draw(sprPlayer); window.draw(sprBarBack); window.draw(sprBar); window.draw(txtStart); window.display(); } if(Keyboard::isKeyPressed(Keyboard::Space)) { if(accY>-8){accY=accY-0.75;} } else { if(accY<16){accY=accY+0.25;} } if(posY-20<35) { life=life+(accY*(std::rand()%2+4)); accY=0-accY; } if(posY+20>winY-35) { life=life-(accY*(std::rand()%2+4))/2; accY=0-accY+4; } if(life<0) { std::cout << "player died" << std::endl; restartGame(); resetVariables(); } posY=posY+accY; sprPlayer.setPosition(posX, posY); sprPlayer.setRotation((accY-4)*2); sprBarBack.setPosition(posX-10, posY-40); sprBar.setPosition(posX-10, posY-40); sprBar.setTextureRect(IntRect(0, 5, life, 10)); window.clear(Color(2, 0, 10)); window.draw(sprBackground); window.draw(sprPlayer); object.Update(window, elapsedTime); object.Render(window); window.draw(sprBarBack); window.draw(sprBar); window.display(); } return 0; } void restartGame() { spaceStarted=false; std::cout << "restarted" << std::endl; } void resetVariables() { posX=80; posY=winY/2; accY=0; life=100; std::cout << "variables reset" << std::endl; }
-
Zur Sicherheit einfach mal sf::string durch std::string austauschen, hast du schon gemacht?
MFG
-
derFer schrieb:
Zur Sicherheit einfach mal sf::string durch std::string austauschen, hast du schon gemacht?
MFG
Ja das hab ich auch schon probiert
-
Welche SFML-Version? Selbst gebaut? Welcher Compiler?
-
MFK schrieb:
Welche SFML-Version? Selbst gebaut? Welcher Compiler?
SFML 2.0
Visual C++ 2010 Express
-
2.0 ist gut, hast du 2.0 RC benutzt, also von der Webseite, oder hast du dir SFML selbst kompiliert (aus dem Repository)?
MfG