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 :

fonction template qui fait buguer juste par sa présence


Sujet :

Langage C++

  1. #1
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut fonction template qui fait buguer juste par sa présence
    Bonjour,
    Encore un bug extrêmement mystérieux. J'ai un programme qui affiche un simple cube en opengl, un test pour une lib plus complexe (20k lignes). Dans cette lib, j'ai une classe pour les matrices. Quand j'ajoute dans Matrix.h une fonction templatée Matrix<REAL> invertMatrix(const Matrix<REAL>&), extérieure à la classe, j'ai le cube qui disparait de mon sample.

    Les deux sont complètement décorellés, je n'utilise la fonction invert nulle part dans ma lib pour l'instant, elle ne devrait même pas etre compilée car templatée. Je ne comprend pas par quel mécanisme sa simple présence dans mon code fait disparaitre mon cube . Si je la commente, mon cube réapparait.
    Je compile sous Ubuntu, gcc 4.4.3/cmake.

    J'ai pensé que ce bug pourrait etre le symptome de quelque chose de plus grave comme corruption mémoire, mais valgrind est OK. Je sèche, quelqu'un aurait des pistes ?

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Recompile tout, après avoir suprimé ('clean') tous les fichiers intermédiaires de compilations.


    Selon le type de manipulation que tu fais à la compilation, si tu fais des compilation incrémentales (par défaut en debug pour quasi tous les compilo C++) tu peux arriver à des cas où certains fichiers obj ou o (le code avant d'être convertis en executable) ne correpondent plus les uns aux autres.

    Quand tu as ce genre de bug très obscure, commence toujours par une recompilation complète "à vide".

  3. #3
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Je le fais régulièrement. Je l'ai refait à l'instant, avec la fonction incriminée, je ne vois toujours pas mon cube. Je l'ai commentée, tout renettoyé et recompilé, je voyais à nouveau mon cube.

    A tout hasard, je met la fonction en question, si ca se trouve c'est un truc con
    Code : 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
     
    template <typename REAL> Matrix<REAL,3> matrixInvert(const Matrix<REAL,3>& p_matrix)
    {
    	REAL det = p_matrix(0,0)*p_matrix(1,1)*p_matrix(2,2) +
    		p_matrix(1,0)*p_matrix(2,1)*p_matrix(0,2) +
    		p_matrix(2,0)*p_matrix(0,1)*p_matrix(1,2) -
    		p_matrix(2,0)*p_matrix(1,1)*p_matrix(0,2) -
    		p_matrix(2,1)*p_matrix(1,2)*p_matrix(0,0) -
    		p_matrix(2,2)*p_matrix(1,0)*p_matrix(0,1);
    	if(det==0) throw std::logic_error("Inverting matrix with null det");
    	return Matrix3<REAL>(
    					(p_matrix(1,1)*p_matrix(2,2) - p_matrix(2,1) * p_matrix(1,2)) / det,
    					(p_matrix(2,0)*p_matrix(1,2) - p_matrix(1,0) * p_matrix(2,2)) / det,
    					(p_matrix(1,0)*p_matrix(2,1) - p_matrix(2,0) * p_matrix(1,1)) / det,
     
    					(p_matrix(2,1)*p_matrix(0,2) - p_matrix(0,1) * p_matrix(2,2)) / det,
    					(p_matrix(0,0)*p_matrix(2,2) - p_matrix(2,0) * p_matrix(0,2)) / det,
    					(p_matrix(2,0)*p_matrix(0,1) - p_matrix(0,0) * p_matrix(2,1)) / det,
     
    					(p_matrix(0,1)*p_matrix(1,2) - p_matrix(1,1) * p_matrix(0,2)) / det,
    					(p_matrix(1,0)*p_matrix(0,2) - p_matrix(0,0) * p_matrix(1,2)) / det,
    					(p_matrix(0,0)*p_matrix(1,1) - p_matrix(1,0) * p_matrix(0,1)) / det);
     
     
    }
    EDIT : merci pour le renomage du topic, j'ai du mal a trouver un nom probant pour ce genre de trucs Même si au final c'est pas lié au fait que ca soit une lib.

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Quand ce code est décommenté, tu ne l'appelles pas dans le reste du code?

    Vérifie par une recherche si il n'y a pas du code, peut être dans une lib que tu utilises, qui n'utilise pas une fonction au même nom et ddont les paramettres pourraient correspondre.

    Aussi, encapsule cette fonction dans un namespace pour l'isoler, peut être que ça reglera le problème...

  5. #5
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    La fonction est déja dans un namespace. Le seul endroit où je me sert de cette fonction c'est dans son unit test, mais j'ai commenté l'endroit. Quand je la commente, le compilateur ne se plaint pas.
    Par contre si je change son nom, le cube réapparait !

    EDIT : OK trouvé ! Il se trouve que j'avais en effet une autre fonction matrixInvert, également templatée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename REAL, unsigned D> Matrix<REAL,D> matrixInvert(const Matrix<REAL,D>& m)
    La fonction que j'avais rajouté est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename REAL> Matrix<REAL,3> matrixInvert(const Matrix<REAL,3>& p_matrix)
    Il a donc pris ma nouvelle fonction comme une spécialisation de l'ancienne, alors qu'elles font des choses différentes ! J'ai renomé l'ancienne pour un nom qui reflète plus sa vraie fonction.
    Merci toi Klaim et a tous pour le temps passé !

  6. #6
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Pas de problème, on est là pour ça

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/05/2011, 18h22
  2. Editeur de texte qui fait la sélection par colonne
    Par wodel dans le forum Windows XP
    Réponses: 5
    Dernier message: 10/11/2010, 13h45
  3. Ma fonction "Recherche" qui fait des siennes
    Par nicolas2603 dans le forum VBA Access
    Réponses: 0
    Dernier message: 16/01/2008, 17h27
  4. Fonction JavaScript qui fait un filtre
    Par soumou dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 10/04/2007, 12h36
  5. Requête qui fait une somme par ligne
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/08/2006, 08h30

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