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�taprogrammation : taille d'un tableau


Sujet :

C++

  1. #1
    Membre chevronn�
    Inscrit en
    Novembre 2006
    Messages
    362
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par d�faut M�taprogrammation : taille d'un tableau
    Bonjour,

    Je souhaite utiliser dans mon code, des tableaux statiques constants.
    Mon probl�me est de parcourir ces tableaux : pour cela, il me faut leur taille.

    Mon id�e premi�re �tait de cr�er une m�thode template qui me renverrait la taille d'un tableau. Quelque chose comme �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template<typename T, int i, T[i]>
    int GET_ARRAY_SIZE()
    {
       return i;
    };
    Cependant, je ne peux pas appeler cette m�thode sans lui fournir i, c'est � dire la taille de mon tableau, c'est � dire pr�cis�ment ce que je cherche � obtenir.

    Je me suis donc rabattu sur un check qui v�rifie que mon tableau est bien de la taille que je crois :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    template<typename T, int i, T[i]> struct CHECK_ARRAY_SIZE{};
    que j'utilise comme ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //------------ header ------------
    class A
    {
        // mon tableau et sa taille
        static const float m_MyArray[];
        static const int m_iMyArraySize;
     
        // une fonction dans laquelle je vais m'en servir
       void m();
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //------------ body------------
    const int A::m_iMyArraySize = 3;
    const float  A::m_MyArray[] = {2.4F,3.7F,6.2F};
     
    void A::m()
    {
        CHECK_ARRAY_SIZE<const float,m_iMyArraySize,m_MyArray> a;
    }
    Tout ceci marche parfaitement bien et compile sauf si je la taille de mon tableau n'�gale pas m_iMyArraySize.

    Mon probl�me est que je n'arrive pas � l'utiliser avec des tableaux de char*, pour une raison sans doute �vidente mais qui m'�chappe :

    ainsi le code :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //------------ header ------------
    class A
    {
        // mon tableau et sa taille
        static const char* m_MyArray[];
        static const int m_iMyArraySize;
     
        // une fonction dans laquelle je vais m'en servir
       void m();
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //------------ body------------
    const int A::m_iMyArraySize = 4;
    const char* A::m_MyArray[] = {"joe","jack","william","averell"};
     
    void A::m()
    {
        CHECK_ARRAY_SIZE<const float,m_iMyArraySize,m_MyArray> a;
    }
    provoque l'erreur de compilation :
    error C2975: 'function-parameter' : argument de mod�le non valide pour 'CHECK_ARRAY_SIZE', expression de constante �valu�e au moment de la compilation attendue
    Je suppose que �a a un rapport avec le fait que si le pointeur est const, la donn�e qui pointe ne l'est pas forc�ment, et donc elle ne peut �tre �valu�e � la compilation, mais je n'arrive pas � trouver comment faire que cela marche.

    Quelqu'un aura-t-il une piste pour me sortir d'affaire ?

    Merci d'avoir lu ce post,
    Merci � ceux qui voudront bien m'aider.

  2. #2
    Membre chevronn�
    Inscrit en
    Novembre 2006
    Messages
    362
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par d�faut
    Mea maxima culpa.

    En fait cela marche, c'est juste que j'utilisais la mauvaise variable, et donc cela plantait exactement comme je voulais que �a plante.

    Bon ben je vais aller me jeter.
    Merci � tous

  3. #3
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Le nombre d'elements dans un tableau C, c'est sizeof(tab)/sizeof(*tab).

  4. #4
    Membre chevronn�
    Inscrit en
    Novembre 2006
    Messages
    362
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par d�faut
    Merci pour cette r�ponse.

    Je croyais avoir de bonnes raisons de ne pas utiliser sizeof, mais en essayant de les �crire, elles se sont �vanouies.

    Merci donc.

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    En C++, tu peux faire plus s�r pour obtenir la taille d'un tableau, gr�ce aux templates.
    C'est ainsi qu'est faite la macro ARRAYSIZE() de Visual:
    http://www.developpez.net/forums/sho...87&postcount=6
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    http://hermitte.free.fr/Info/C++/lib..._help.hpp.html

    Pour la fonction begin(), il faut rajouter un +0 � ce que l'on veut renvoyer selon les compilos. De toutes fa�ons, c'est dans boost.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  7. #7
    Membre chevronn�
    Inscrit en
    Novembre 2006
    Messages
    362
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par d�faut
    Merci pour ces r�ponses qui cadrent plus avec ce que je voulais faire originalement.

    Si vous repassez par ici, je me permets d'abuser de vos lumi�res en vous demandant des pr�cisions sur ces deux codes.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template <std::size_t N>
            struct array { char value[N]; };
    template<typename T, std::size_t N>
            array<N> array_size_helper(T (&)[N]);
    #define array_size(array) (sizeof luc_lib::array_size_helper(array).value)
    Si je comprend bien, l'id�e est que la fonction array_size_helper : plut�t que de renvoyer directement la taille du tableau, renvoie une structure contenant un tableau de char de la m�me taille.
    La macro donne la taille de ce tableau en octets, et comme la taille d'un char doit �tre 1 octet, c'est aussi la taille du tableau en nombre d'�l�ments.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    template< class T, size_t N >
    		char (* TArraySize(T (&tab)[N]) )[N];
    #define ARRAYSIZE(arr) sizeof(*TArraySize(arr))
    Si j'ai bien compris, il s'agit de la m�me strat�gie : une m�thode qui renvoie un tableau de char de la m�me taille que le tableau pass� en param�tre + une macro qui fait le sizeof de ce tableau retourn�.


    Question 1 : pourquoi est-ce plus efficace et/ou s�curitaire qu'un sizeof(array)/sizeof(�l�ment) ?

    Question 2 : pourquoi passer par sizeof. Si la m�thode array_size_helper renvoyait directement N, ne pourrait-elle pas �tre �valu�e � la compilation ? Pourquoi ?

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Luc : (edit : J'ai rien dit)

    Feriaman :
    1. Parce que sizeof/sizeof "marche" sur les pointeurs, retournant, au lieu de la taille du tableau, la taille du pointeur divis�e par la taille d'un �l�ment point�. ARRAYSIZE() en template �vite ce probl�me en provoquant une erreur de compilation si on tente de l'utiliser sur autre chose qu'un tableau.
    2. array_size_helper ne "renvoie" rien du tout, et n'est m�me jamais appel�e. ARRAYSIZE() ne fait que consulter la taille de ce que array_size_helper renverrait si on l'appelait avec un tel tableau. Et cette taille est vraiment constante, connue � la compilation, alors qu'un r�sultat de fonction ne l'est jamais.


    PS: La version de Luc a l'avantage d'�tre plus lisible que celle de Microsoft que j'ai recopi�e de m�moire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre chevronn�
    Inscrit en
    Novembre 2006
    Messages
    362
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par d�faut
    Merci encore : C'est tr�s clair.

  10. #10
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Citation Envoy� par M�dinoc
    Luc : (edit : J'ai rien dit)
    Ca tombe bien, je n'ai ren vu

    PS: La version de Luc a l'avantage d'�tre plus lisible que celle de Microsoft que j'ai recopi�e de m�moire.
    Dire que "la version de Luc" est un peu abus�. J'avais repomp� �a sur fclc++ il y a quelques temps d�j�. D'ailleurs pour avoir plus d'infos, cherchez le m-id donn� dans mon fichier via groups.google.com ; il doit y avoir un petit thread sympa � lire dans mes souvenirs.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Tableau]comment connaitre la taille d'un tableau à 2 dimensions
    Par Kyti dans le forum Collection et Stream
    R�ponses: 4
    Dernier message: 22/04/2005, 10h27
  2. R�ponses: 2
    Dernier message: 25/07/2004, 15h55
  3. taille d'un tableau
    Par monstour dans le forum ASP
    R�ponses: 3
    Dernier message: 24/06/2004, 15h16
  4. Taille maximum de tableau en Delphi
    Par yannick37 dans le forum Langage
    R�ponses: 5
    Dernier message: 03/03/2004, 13h18
  5. qbasic : taille d'un tableau
    Par clood200 dans le forum Basic
    R�ponses: 2
    Dernier message: 16/09/2003, 07h26

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