IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

extern std:map problème exécution


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Par défaut extern std:map problème exécution
    Bonjour, J'ai un petit problème à l'utilisation d'une map définie de cette façon :
    un fichier .h contient extern std::map<int,et ici un type d'une bibliothèque> Images;
    un fichier .cpp contient la même chose sans le extern.
    Je précise que ce map appartient à un espace de nom défini dans le .h.
    J'utilise ce map dans le fichier .cpp...
    A la base dans mon application, l'erreur survenait quand je quittait le programme.
    J'ai réduit à un code minimal mais rien n'y fait tant que ma définition du map se trouve dans un autre fichier ça plante, par contre si je déclare directement dans le .cpp ou même dans le main.cpp aucune erreur.

    Merci à ceux qui sauront m'expliquer pourquoi la déclaration extern d'un std::map pose problème.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Par défaut
    Svp personne n'a d'idées concernant mon probleme ?

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Dans le .cpp, tu as bien déclaré ta map en l'incluant aussi dans l'espace de nom?
    Sinon, si tu nous montrais ce code minimal ainsi que le message d'erreur que ça génère ça nous aiderait.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Par défaut
    Merci d'avoir répondu, voila mon code en gros paske j'ai presk tout mis en commentaires donc je mets que ce qui est actif:

    Entity.h

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #ifndef ENTITY_H
    #define ENTITY_H
     
    #include <SFML/Graphics.hpp>
     
     
    namespace Engine
    {
     
    		extern std::map<sf::Uint32,sf::Image> Images;
    		extern sf::Uint32 Images_Number;
     
    /* plus les déclarations de classes*/
    }
     
    #endif

    Entity.cpp

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "Entity.h"
     
    std::map <sf::Uint32,sf::Image> Engine::Images;
    sf::Uint32 Engine::Images_Number=0;
     
    /*définitions fonctions membres des classes*/

    main.cpp

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "Entity.h"
    #include <SFML/Graphics.hpp>
    #include <iostream>
     
    int main()
    {
    	std::string f;
    	Engine::Terrain plain("sprite_model_6.png");
     
    	std::cin >> f;
     
    return EXIT_SUCCESS;
    }

    Sachant que mon construteur ne fait juste que :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sf::Image Temp;
    Images[0] = Temp;

    Si je met tout dans le même header tout marche...

    Voila si vous avez d'autres questions je guette le forum

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Par défaut
    Petite précision zais_ethael, même si je mets ce que tu m'as dit

    namespace Engine
    {
    std::map <sf::Uint32,sf::Image> Images;
    std::Uint32 Images_Number = 0;
    }

    j'obtiens la même erreur qui est du genre "la mémoire ne peut pas être read"

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Par défaut
    Du nouveau, j'arrive à faire marcher tout ça, mais c'est très étrange (ou alors quelque chose m'échappe)

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set_Type(Get_Images_Number());		
    	sf::Image Temp;	
    	std::pair <std::map<sf::Uint32,sf::Image>::iterator,bool> k = Images.insert(std::make_pair(Get_Type(),Temp));
    	if(k.second)
    		std::cout << "OK";
    	else
    		std::cout << "ERROR";
    	Images.clear();

    voila le code de mon constructeur, si j'efface tous les éléments l'exécution se termine normalement, sinon elle échoue...
    Mais dans tous les cas l'insertion s'effectue correctement.
    Ce qui m'indique qu'après l'utilisation d'un map il faut effacer tous les éléments ?
    Bizarre bizarre...
    Y a t'il un expert de la stl parmi vous ? lol

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Pour ton problème je ne vois pas, désolé. A la rigueur il se peut qu'il s'agisse d'un problème de dépendances statiques (en C++, tout ce qui est variables globales ou statiques est fort fort mal géré, cela peut conduire à des bugs assez inexplicables, c'est pour cela qu'on évite autant que possible de les utiliser). Ici ça ne devrait normalement pas être le cas mais il se pourrait que les variables statiques de la SFML soient détruites avant les tiennes, et ce en admettant que le destructeur de sf::Image aie besoin de ces variables statiques (faut avoir l'esprit large - Laurent si tu es là ).
    Tout ce que je peux te conseiller pour être tranquille est de laisser tomber les variables globales et statiques. Ou alors de les remplacer par quelque chose de beaucoup plus simple (genre un simple pointeur, ta map tu l'initialises sur la pile et en même temps tu fait pointer le pointeur statique dessus), mais dans l'absolu un bon design avec beaucoup de classes et une bonne répartition des taches peut faire des miracles aussi .

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Qu'est-ce que ça donne si ta map ne contient pas des sf::Image, mais des entiers par exemple ?
    Tu dis que le code plante, si tu mets un debuger, où le problème est-il ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 21
    Par défaut
    Merci pour vos réponses, zais_ethael Laurent m'a répondu quelque chose de similaire je suis désolé d'avoir posté sur les deux forums, mais j'étais vraiment désespéré depuis le temps.
    JolyLoic Oui a partir du moment ou je change le type, plus aucun problème, j'avais déjà essayé ça vient bien du fait qu'il y a un sf::Image dedans mais surtout que mon map soit défini dans un source et la déclaration dans un header. Si je condense dans un même fichier plus aucun problème non plus...
    Je pensais au début que ma syntaxe avec extern était fausse je sais pas n'importe quel truc pouvait être la cause j'ai regardé partout mais non, ça vient bien de la libération mémoire.

    Encore merci

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Pour l'autre thread voir ici: http://www.sfml-dev.org/forum-fr/viewtopic.php?t=737
    D'après Laurent c'est bien ce que je suspectais. Waw, il y avait pas une chance sur cent
    Conclusion : avec la SFML, faut pas garder une quelconque objet en statique.

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Attention: extern != static...

    Dans une déclaration, extern signifie simplement "cette variable existe et est définie ailleurs", alors que static permet de s'assurer de la liaison sur base du module dans lequel la variable est déclarée (et, au final, de s'assurer que tous les appels à la variables seront effectués sur la même instance de cette variable).

    Je me demande donc s'il ne serait pas au final intéressant de travailler avec une std::map statique plutôt qu'avec une std::map externe (voire, pourquoi pas, carrément de mettre cette map dans un singleton)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Problème remplissage std::map
    Par Pixcoder dans le forum Langage
    Réponses: 9
    Dernier message: 13/06/2009, 10h21
  2. Réponses: 7
    Dernier message: 17/01/2009, 13h10
  3. std map problème récurrent
    Par Champignon_atomik dans le forum SL & STL
    Réponses: 11
    Dernier message: 03/10/2008, 17h35
  4. Problème de class template et std::map
    Par bathof dans le forum Langage
    Réponses: 2
    Dernier message: 31/07/2007, 22h18
  5. Problème de fonction "const" avec une std::map
    Par Clad3 dans le forum SL & STL
    Réponses: 3
    Dernier message: 02/01/2007, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo