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 :

typedef et tableau


Sujet :

Langage 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 typedef et tableau
    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
    template<unsigned BS>
    class chose
    {
    public:
    	typedef unsigned char byte;
    	typedef byte buffer_type[BS];
    	buffer_type *f_buffer;
    public:
    	chose():f_buffer(NULL) {f_buffer=new buffer_type;}
    	~chose() {delete f_buffer;}
    };
     
     
    	chose<24> ch1;//<- erreur compil
    	chose<16>::buffer_type ch2;//<- OK
    Et voici la belle erreur que j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2440: '=' : cannot convert from 'chose<BS>::byte *' to 'unsigned char (*)[256]'
    Je ne comprend pas pourquoi
    Merci pour vos lumières.

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Bonjour.

    Ce bout de code me dérange.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	typedef byte buffer_type[BS];
    Il me semble bien (et le méga cours de C++ me le confirme) que ton typedef devrait être dans l'autre sens...

    A moins que tu ne veuille définir un type buffer_type sous le nom byte mais dans ce cas, il y aurait un conflit...

    ta classe n'est donc pas instanciable puisque buffer_type n'est pas défini. pour le reste, l'erreur se produit dans ton constructeur puisqu'il ne reconnais pas buffer type, mais je ne suis pas sûr des détails.

    j'ignore pourquoi ça compile avec chose<16>::buffer_type kohala pourra probablement nous renseigner là dessus.

    Bonne chance.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Non c'est bien le bon sens, on écrit par exempleet non pasMais le problème vient du fait que les tableaux "à la C" ne sont pas des objets comme les autres en C++, il ont un comportement particulier, compatibilité avec le C oblige.

    Et notamment, l'expression "new T[N]" ne retourne pas un objet de type T[N] mais un pointeur vers le premier objet T parmi les N alloués, d'où l'erreur de compilation. Et passer par un typedef n'y change rien, apparemment.

  4. #4
    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
    Ceci est OK:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template<unsigned BS>
    class chose
    {
    public:
    	typedef unsigned char byte;
    	struct buffer_type
    	{
    		byte s_buf[BS];
    	};
    	buffer_type *f_buffer;
    public:
    	chose():f_buffer(NULL) {f_buffer=new buffer_type;}
    	~chose() {delete f_buffer;}
    };
    La syntaxe du C++ est parfois déroutante...

    Donc il n'y a pas de solutions ? On ne peut pas allouer dynamiquement un type défini comme étant un tableau sous-jacent ?

  5. #5
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Non c'est bien le bon sens, on écrit par exempleet non pas
    effezctivement... et la page que j'ai cité me contredit également.. j'ai plkus qu'a changer d'yeux... et de cerveau aussi
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Non mais attends... buffer_type a une taille connu à la compilation, donc pourquoi t'essayes de l'allouer sur le tas, forcément ça peut pas marcher...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    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
    Ah bon ?
    On ne peut pas allouer sur le tas un type dont la taille est connue à la compilation ?

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Bah tu fais souvent ce genre de code toi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int quux[42];
     
    quux = new int[42];
    ?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    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
    Si tu relis bien mon code c'est plutôt ceci que j'essaie de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef int quux_type[42];
     
    quux_type quux;//allocation sur la pile acceptée
     
    quux_type *quux_ptr;
    quux_ptr = new quux_type;//allocation sur le tas refusée

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    L'allocation n'est pas refusée, elle retourne juste pas tout à fait le type que tu attend. Mais un cast est tout à fait safe je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    quux_ptr = (quux_type*)new quux_type;

  11. #11
    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
    boost.array ?
    (ou std::[tr1::]array)
    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
    #include <boost/array.hpp>
    template<unsigned BS>
    class chose
    {
    public:
    	typedef unsigned char byte;
    	typedef boost::array<byte,BS> buffer_type;
    	buffer_type *f_buffer;
    public:
    	chose():f_buffer(NULL) {f_buffer=new buffer_type;}
    	~chose() {delete f_buffer;}
    };
     
    int main()
    {
    	chose<24> ch1;//<- erreur compil
    	chose<16>::buffer_type ch2;//<- OK
    	return 0;
    }

  12. #12
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par camboui Voir le message
    Si tu relis bien mon code c'est plutôt ceci que j'essaie de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef int quux_type[42];
     
    quux_type quux;//allocation sur la pile acceptée
     
    quux_type *quux_ptr;
    quux_ptr = new quux_type;//allocation sur le tas refusée

    ohhh! J'avais omis la petite étoile entre buffer_type et f_buffer, autant pour moi alors. Je savais que ça m'étonnait que tu essayes de faire ce genre de chose...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  13. #13
    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
    Citation Envoyé par 3DArchi Voir le message
    boost.array ?
    (ou std::[tr1::]array)
    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
    #include <boost/array.hpp>
    template<unsigned BS>
    class chose
    {
    public:
    	typedef unsigned char byte;
    	typedef boost::array<byte,BS> buffer_type;
    	buffer_type *f_buffer;
    public:
    	chose():f_buffer(NULL) {f_buffer=new buffer_type;}
    	~chose() {delete f_buffer;}
    };
     
    int main()
    {
    	chose<24> ch1;//<- erreur compil
    	chose<16>::buffer_type ch2;//<- OK
    	return 0;
    }
    Oui, sans doute...
    Voir mon post #4, il suffit d'encapsuler le tableau dans une structure, ce que fait boost::array par ailleurs.

Discussions similaires

  1. Tableau dans typedef
    Par Raikyn dans le forum C
    Réponses: 18
    Dernier message: 25/04/2012, 16h34
  2. Typedef d'un tableau et pointeur
    Par LittleWhite dans le forum Débuter
    Réponses: 3
    Dernier message: 15/12/2009, 00h45
  3. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21
  4. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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