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 :

métafonction et MSVC6


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut métafonction et MSVC6
    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 <int i>
    struct metafunc_log2
    {
    	enum { value=1+metafunc_log2< (i>>1) >::value };
    };
     
    template <>
    struct metafunc_log2<1>
    {
    	enum { value=0 };
    };
     
    template<typename UI>
    struct serializable_type
    {
    	enum { bytes=sizeof(UI), bits=bytes*8, log2=metafunc_log2<bytes>::value };
    };
     
    int main(int argc, char* argv[])
    {
     int log2=serializable_type<unsigned short>::log2;
     int bytes=serializable_type<unsigned short>::bytes;
     int bits=serializable_type<unsigned short>::bits;
     return 0;
    }
    Ce simple code ne passe pas sous VC++6:
    ..\serial.h(16) : fatal error C1001: INTERNAL COMPILER ERROR

    Est-ce peine perdue ou est-il possible de le contourner en augmentant la pile d'exécution ou autre optio du compilo ?
    Merci.

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonjour,

    vous êtes juste tombé sur un bug de compilateur
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Visual 6 est sorti avant que le C++ soit normé. Il y a donc qqs problèmes à essayer de faire de la prog. générique avec visual 6. Si tu peux change de compilo (version express dispo gratuitement).
    Je n'ai pas VC6 ici, mais essaies de changer ton décalage par une division :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <int i>
    struct metafunc_log2
    {
    	enum { value=1+metafunc_log2< (i/2) >::value };
    };
     
    template <>
    struct metafunc_log2<1>
    {
    	enum { value=0 };
    };

  4. #4
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    MSVC6 + template, perso j'évite

    cette ICE venait du fait que A< i >> 2 > etait mal parsé.

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Je pense que le pb vient plutôt du paramètre template constant:J'ai eu plusieurs cas semblables que j'ai du contourner en passant par des macros.

    Alors oui j'utilise aussi VS2005, pour les nouveaux projets. Mais j'ai toujours un pied dans MSVC6 qui, quoiqu'on en dise, fait du bon boulot.
    Mais c'est vrai que depuis que je fais de la prog générique un peu évoluée, son âge avancé se fait ressentir.

    Merci à tous.

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Arf, j'en reviens pas, ceci passe sans soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <unsigned i>
    struct metafunc_log2
    {
    	enum { value=1+metafunc_log2< (i>>1) >::value };
    };
     
    template <>
    struct metafunc_log2<1>
    {
    	enum { value=0 };
    };
    Le simple changement de template <int i> en template <unsigned i> plait à MSVC6.
    Surprenant

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut !

    C'est vrai c'est un peu surprenant, mais d'un autre côté, le décalage de bits a plus de "sens" sur un entier non signé.

    Celà dit j'ai déjà eu des "Internal compiler error" avec VS2008, avec des templates un peu alambiqués. C'est assez perturbant
    Find me on github

  8. #8
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    le décalage de bits a plus de "sens" sur un entier non signé.
    en fait dans le cas d'un entier non signé >> fait un décalage, dans le cas d'un entier signé >> fait une rotation (pour conserver le signe).
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par bruno_pages Voir le message
    en fait dans le cas d'un entier non signé >> fait un décalage, dans le cas d'un entier signé >> fait une rotation (pour conserver le signe).
    Je ne vois pas comment une rotation conserverait le signe.

    (Les decalages vers la droite en signe laissent souvent inchange le bit de signe, mais ce n'est pas une rotation).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    c'est vrai que de parler de rotation sans plus d'info est assez trompeur, ce n'est pas une rotation 'habituelle' au sens ou le bit de rang 0 de deviendrait le bit de plus fort poids. En fait le bit de plus fort poids est décalé et est recopié dans lui même, et bizarement si je me souviens bien cela s'appelle aussi une rotation (pas ma faute )
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

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

Discussions similaires

  1. Métaprogrammation et métafonctions en C++11
    Par Francis Walter dans le forum C++
    Réponses: 0
    Dernier message: 29/03/2015, 08h48
  2. Question migration de MSVC6 à MSVC2010
    Par niocnioc dans le forum Visual C++
    Réponses: 6
    Dernier message: 16/02/2012, 16h39
  3. [CPPUNIT] Erreurs de link avec MSVC6.0
    Par vdaanen dans le forum Test
    Réponses: 1
    Dernier message: 04/11/2008, 12h22
  4. Linker avec une DLL compilée avec MSVC6
    Par Neilos dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/08/2006, 21h46
  5. Réponses: 1
    Dernier message: 02/12/2005, 14h18

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