Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML Exception throw at

Sujet résolu
11 février 2019 à 15:55:42

Bonjour,

Voilà avec SFML je voulais créer une classe simple pour créer des boutons. Je crée juste un rectangle sur lequel j'affiche du texte pour l'instant mais quand je teste le programme ça me dit "Exception levée à 0x0F6D49EF (sfml-graphics-d-2.dll) dans testBouton.exe : 0xC0000005 : Violation d'accès lors de la lecture de l'emplacement 0xCCCCCCD0."

Il m'indique une erreur au niveau du texte, pourtant j'ai les bons dlls dans mon projet et quand je créer le bouton directement dans le main sans passer par une classe ça marche très bien. Je ne comprend donc pas le problème alors si vous pouvez m'aider je vous en serais reconnaissant :) (PS: j'utilise Visual Studio comme IDE)

main.cpp

#include <SFML/Graphics.hpp>
#include "Button.h"

const int WIDTH = 800;
const int HEIGHT = 600;

int main()
{
	sf::RenderWindow window(sf::VideoMode(WIDTH, HEIGHT), "Test");

	Button button(200, 50, "Test");

	while (window.isOpen())
	{
		sf::Event event;
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				window.close();
		}

		window.clear();
		button.draw(window);
		window.display();
	}

	return EXIT_SUCCESS;
}

Button.h

#pragma once

#include <SFML/Graphics.hpp>

class Button
{
public:
	Button(float width, float height, const std::string& text);

	void draw(sf::RenderWindow& window);

private:
	sf::RectangleShape m_button;
	sf::Text m_text;
};

Button.cpp

#include "Application.h"

Button::Button(float width, float height, const std::string& text) : m_button({ width, height })
{
	m_button.setOutlineColor(sf::Color::Blue);
	m_button.setOutlineThickness(4);

	sf::Font font;
	font.loadFromFile("rs.ttf");

	m_text.setFont(font);
	m_text.setString(text);
	m_text.setOutlineColor(sf::Color::Black);
	m_text.setOutlineThickness(2);
	m_text.setCharacterSize(12);
}

void Button::draw(sf::RenderWindow& window)
{
	m_button.setPosition(window.getSize().x / 2 - m_button.getLocalBounds().width / 2,
		window.getSize().y / 2 - m_button.getLocalBounds().height / 2);

	m_text.setPosition(window.getSize().x / 2 - m_text.getLocalBounds().width / 2,
		window.getSize().y / 2 - m_text.getLocalBounds().height / 2);

	window.draw(m_button);
	window.draw(m_text);
}

Voilà j'espère que vous pourrez m'aider ça se trouve c'est un truc tout bètes mais je trouve pas.

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 16:03:25

Le mieux, c'est d'utiliser le débugger pour voir sur quelle ligne il plante. :)
  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 16:23:33

Dans Button.cpp dans la fonction draw() c'est là qu'il plante:

Si j'enlève cette ligne il plante à la ligne window.draw(m_text);

-
Edité par clemb01 11 février 2019 à 16:26:51

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 16:43:36

A tout hasard ça ne serait pas le fichier de font qui n'a pas été chargé correctement ? Tu ne testes pas le retour de loadFromFile.
  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 16:52:45

J'ai vérifier le problème ne viens pas de ça
  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 16:59:57

Ah ! Bah perso de mon côté je ne vois pas.

Ce que j'aurais fait pour discriminer la fonction qui pose soucis c'est essayer de faire

m_text.setPosition(0, 0);

pour voir si le problème vient de setPosition. A l'inverse essayer d'afficher en console m_text.getLocalBounds() pour voir si les valeurs sont correctes.

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 17:16:00

ça ne change rien du tout je pige vraiment pas la :/

SI je remplace le texte par une forme ça ne pose évidement aucun problème donc il doit y avoir un problème lors de l'initialisation de la variable mais quand je fais la même chose directement dans le main ça marche, c'est à n'y rien comprendre :(

EDIT: Bon j'ai trouvé le problème, il venait du font déclaré dans le constructeur vu que la variable font était détruite a la fin de la construction, il a suffit de la déclarer comme attribut de la classe pour résoudre le problème et ainsi pouvoir l'utiliser dans la méthode draw()

-
Edité par clemb01 11 février 2019 à 17:25:27

  • Partager sur Facebook
  • Partager sur Twitter
11 février 2019 à 17:25:10

Hello,

Une font est une ressource, elle doit exister tout le temp où elle est utilisée.

Button::Button(float width, float height, const std::string& text) : m_button({ width, height })
{
    sf::Font font;
    font.loadFromFile("rs.ttf");
 
    m_text.setFont(font);

    // ...
}

Ici la font est détruite en fin de scope. Donc à la première utilisation du texte (plus précisémment au moment du draw), ça plante ;).

-
Edité par Guit0Xx 11 février 2019 à 17:28:11

  • Partager sur Facebook
  • Partager sur Twitter

...

11 février 2019 à 17:31:34

Merci Guit0xx, j'avais trouvé le problème quelque instant à peine avant que tu poste :) ^^

-
Edité par clemb01 11 février 2019 à 17:32:49

  • Partager sur Facebook
  • Partager sur Twitter
16 février 2022 à 18:21:53

Bonjour,

exactement même problème, le ttf semble poser problème, qu'a t'il était fait pour régler le problème ?

  • Partager sur Facebook
  • Partager sur Twitter
16 février 2022 à 19:37:06

@Blocked Bonsoir, merci de ne pas déterrer d'ancien sujet résolu.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter