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

Langage C++ Discussion :

Inclusion de code source dans différents fichiers d'une bibliothèque en compilation. (Comment faire ?)


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Inclusion de code source dans différents fichiers d'une bibliothèque en compilation. (Comment faire ?)
    Salut.

    En fait je voudrais faire ceci : remplacer du code source en compilation dans différent fichiers à l'aide d'une macro, par exemple j'ai ce fichier ici que j'appelle code.h

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "serializer.h"
    #define THECODE(CLASSNAME, BASE, DERIVED...) \
    struct CLASSNAME : public Serializer<BASE, DERIVED>  { \
      //Définition ici.
    }; \
    CLASSNAME obj

    Et ce fichier ci que je vais appeler implémentation.h

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "code.h"
    #ifndef KEY 
    #define KEY GETCODE(DEFAULTNAME, DEFAULTBASE, DEFAULTDERIVED)
    #endif
    class EClass {
    //Défintion de la classe ici.
    KEY
    };

    Et je veux inclure le code qui se trouve dans le fichier code.h, dans la classe du fichier implementation.h afin que EClass contienne l'implémentation de la classe et un objet de la classe dans la macro.

    Ce code est dans une bibliothèque et je donne des paramètres par défaut à la macro pour définir le code à générer au cas ou la macro n'est pas redéfinie en dehors de la librairie.
    Jusque là pas de problème.

    Le problème survient ici :
    Je possède une troisième classe qui utilise pointeur sur un objet de type EClass comme ceci : (Cet objet est une entité graphique que je veux dessiner et EClass n'est rien d'autre qu'un pointeur vers un volume de collision)
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class DClass {   
          public :
          //Definition de la classe ici.
          EClass* ptr;
    };

    Le problème est que lorsque je veux redéfinir la macro qui inclue le code généré en compilation en dehors de la bibliothèque, j'ai un crash lors du dessin et le pointeur sur l'objet EClass est modifié. (c'est à dire que, par exemple, si il était null, celui-ci contient une adresse)

    Je pense que c'est parce que le code du fichier.h de la bibliothèque, ne correspond plus avec le code contenu dans le fichier .a de la bibliothèque.

    Bref je ne vois pas très bien ce que je devrais faire pour régler le problème à part peut être faire une bibliothèque "header only". ?

    Mais je ne suis pas sûr que ça va fonctionner.
    Dernière modification par Neckara ; 21/08/2014 à 11h50. Motif: librarie -> bibliothèque

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Pour l'instant tu ne parle que de .h

    Les define sont valable dans tout le code qui suit la définition.

    Normalement, ces define ne devrait pas intervenir dans le code cpp de ta biblio, car il est utilisé en dehors, je me trompe?

    L'erreur que tu obtiens ne serait pas du à un oubli d'initialisation de variable?

  3. #3
    Invité
    Invité(e)
    Par défaut
    A vrai dire je ne sais pas, le débugueur ne me donne pas beaucoup d'information à ce sujet, je n'ai pas cette erreur quand je ne redéfini pas la macro, ce code ne crash pas.

    Code cpp : 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
    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
     
    #include "odfaeg/Graphics/renderWindow.h"
    #include "glCheck.h"
    #include "odfaeg/Graphics/window.h"
    #include <fstream>
    #include "odfaeg/Core/archive.h"
    #include "odfaeg/Graphics/2D/tile.h"
    #include <functional>
    int main(int argc, char* args[])
    {
        sf::VideoMode mode(800, 600);
        sf::ContextSettings settings(0, 0, 4, 3, 0);
        odfaeg::RenderWindow window(mode, "test", sf::Style::Default, settings);
        odfaeg::Texture tex;
        tex.loadFromFile("tilesets/herbe.png");   
        std::ostringstream oss;
        std::string text = "Ceci est un texte.";
        std::ofstream ofss("FichierDeSerialization.tex");
        {
            odfaeg::OTextArchive oa(ofss);
            oa(tex);
           // oa<<ofss;
        }
        ofss.close();
        std::istringstream iss;
        std::ifstream ifss("FichierDeSerialization.tex");
        {
            odfaeg::ITextArchive ia(ifss);
            ia(tex);
            //ia>>ifss;
        }
        ifss.close();
        odfaeg::g2d::Entity* tile = new odfaeg::g2d::Tile (&tex, odfaeg::Vec3f(0, 0, 0), odfaeg::Vec3f(100, 50, 0), sf::IntRect(0, 0, 100, 50));
        std::cout<<tile->getCollisionVolume()<<std::endl;
        while (window.isOpen()) {
            sf::Event event;
            while(window.pollEvent(event)) {
                if (event.type == sf::Event::Closed) {
                   window.close();
                }
            }
            window.clear();
            window.draw(*tile);
            window.display();
     
        }  
        delete tile;
     
     
        odfaeg::BoundingVolume* b1 = new odfaeg::BoundingSphere(odfaeg::Vec3f(0, 0, 0), 100);
        odfaeg::BoundingVolume* b2;
        std::ofstream ofs("FichierDeSerialisation");
        {
            odfaeg::OTextArchive oa(ofs);
            oa(b1);
        }
        ofs.close();
     
        std::ifstream ifs("FichierDeSerialisation");
        {
            odfaeg::ITextArchive ia(ifs);
            ia(&b2);
        }
        std::cout<<static_cast<odfaeg::BoundingSphere*>(b2)->getCenter()<<" "<<static_cast<odfaeg::BoundingSphere*>(b2)->getRadius()<<std::endl;
        ifs.close();
        return 0;
    Tandis que celui-ci crash :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define BVKEY REGISTER_KEY(BOUNDINGVOLUMKEY, odfaeg::BoundingVolume, odfaeg::BoundingBox, odfaeg::BoundingSphere)

    La macro est définie dans le fichier main, avant tout les include que je fais.

    Bref normalement la déclaration de la classe ne devrait pas influer sur le .cpp comme tu dis, cependant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #0 ??	?? () (??:??)
    #1 0x4300ef	draw(states=..., drawable=..., this=0x7ffffffdd4b8) (/usr/local/include/odfaeg/Graphics/renderTarget.h:30)
    #2 ??	main (argc=<optimized out>, args=<optimized out>) (/home/laurent/Développement/Projets-c++/ODFAEG-DEMO/main.cpp:48)
    En imprimant les adresse pourtant j'en ai bien une adresse pour chaque objet donc c'est au moment de l'appelle de la fonction dans la librairie que ça crash et je ne comprend pas très bien pourquoi. :o

  4. #4
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Donc si je comprends bien:

    Compilation ok, et au runtime ça plante?

    Essaye de passer un coup de valgrind ou tout du moins un truc pour regarder tes fuite mémoire, je suis sur que tu as un petit soucis de mémoire à un endroit .

    Si tu pouvais posté en meme temps la sortie complete de ton application, ça serait cool .

    Rajoute aussi un peu de debug pour savoir exactement l'endroit ou ça plante .

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re, en effet je pense que le problème vient plutôt de la mémoire, je ne vois pas en quoi le fait de changer la définition d'une classe avec une macro, viendrait modifier le pointeur de l'objet sur la classe.

    Valgrind me sors en effet des erreurs mémoire mais je n'arrive pas à poster le fichier ici. (C'est un fichier xml)

    Je ne comprend pas très bien les messages dans ce fichier mais j'ai des messages du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Leak_PossiblyLost
    9 bytes in 1 blocks are possibly lost in loss record 55 of 1,813
    Rajoute aussi un peu de debug pour savoir exactement l'endroit ou ça plante .
    Heu, comment faire cela ?
    Toute ma librairie est compilée en mode débug là..., ou bien alors c'est dans une dépendance utilisée par ma librairie mais ça je n'ai pas de contrôle là dessus. :/

    La sortie me dit juste Erreur de segmentation mais sans vraiment me donner plus d'information.

  6. #6
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Quand tu modifie ton .h et que tu recompile, tu va modifier ton binaire, binaire qui contient tes variables. Il suffit que tu es un debordement de mémoire qui ne se voit pas trop pour que dans certains cas ça fonctionne et d'autre non.

    Le mieux:
    _ compile avec une option -g (ou -ggdb3)
    _ lance valgrind sur ton programme
    _ recherche les invalid write (ou read) qui correspondent à ton code
    _ regarde la ligne dans ton code.
    _ identifie les variable sur cette ligne.
    _ vérifie leur initialisation.
    _ vérifie que tu n'ecris pas dessus alors qu'elles ne sont pas allouer.

    ça c'est en solo, ensuite pour que je te file un coup de main:
    _ poste les invalid write et read qui concernent ton code.
    _ poste les fonctions qui contiennent les invalid read ou write, voir tout le code, que je puisse l'analyser, et le problème sera résolu rapidement .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inclusion d'une partie du code source dans une documentation Doxygen
    Par feanor11 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 01/02/2012, 17h29
  2. Réponses: 3
    Dernier message: 23/05/2011, 23h00
  3. Inclusion de Code Adsense dans un fichier
    Par badrel dans le forum Langage
    Réponses: 6
    Dernier message: 12/02/2009, 11h31
  4. Réponses: 15
    Dernier message: 16/01/2009, 00h16
  5. Réponses: 4
    Dernier message: 10/02/2005, 16h10

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