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 :

Initialiser un tableau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de matteli
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 85
    Par défaut Initialiser un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int proType[65536]={9};
    Lorsque j'utilise ça, il n'y a que la première valeur "proType[0]" qui est initialisée à 9.

    Je compile avec MinGW

    Si quelqu'un pouvait m'expliquer pourquoi ?

  2. #2
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Bonjour matteli, il s'agit en fait d'une mauvaise utilisation des accolades voila un exemple qui devrait etre plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned int Array[4] = {9,9,9,9};
    Si tu veux attribuer une valeurs initiales aux elements de ton tableaux il existe la fonction memset mais si tu dois gerer un tableau je te conseil un vecteur stl pour la gestion dynaimique ou un boost::array pour des tableaux de taille fixe

  3. #3
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut
    Il faut faire une initialisation pour chaque "case" de ton tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int proType[65536];
    for(int* itr = proType; itr < (proType + 65536); ++i)
    {
       *itr = 9;
    }
    sinon même remarque qu'au dessus, vector, ou boost::array.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Ou bien mieux en C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::fill(proType,proType+65536,9);
    ET encore meilleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<int> proType(65536,9);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::vector<int> proType(65536);
    std::fill(proType.begin(),proType.end(),9);

  5. #5
    Membre confirmé Avatar de matteli
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 85
    Par défaut
    Pour ce qui est de vector, je l'utilise déjà pour des tableaux de taille variable.

    Pour ce qui est de boost, j'hésite à m'en servir. Peur de pas savoir m'en servir. J'ai vu qu'il fallait compilé une partie de la biblio pour s'en servir, peut être pas pour les array.

    Je pense que je vais me contenter de la méthode de Floréal. D'ailleurs, si je comprends le but de cette boucle, je ne comprends pas son fonctionnement.

    Si tu peux m'éclairer Floréal.

    Merci

  6. #6
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Moi aussi j'étais réticent au debut pour me lancer dans boost (il y a de ca a peine plus d'une semaine ) mais le tutoriel http://arb.developpez.com/c++/boost/install/vc++/ explique vraiment bien comment installer la librairie si tu utilise visual c++. Et il y a beaucoup de choses a apprendre dans cette librairie

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par matteli Voir le message
    Je pense que je vais me contenter de la méthode de Floréal. D'ailleurs, si je comprends le but de cette boucle, je ne comprends pas son fonctionnement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int proType[65536];
    for(int* itr = proType; itr < (proType + 65536); ++i)
    {
       *itr = 9;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned int proType[65536];
    std::fill(proType,proType+65536,9);
    Sont équivalent. Il parcoure ton tableau avec les pointeur pour initialiser tes valeur.
    Pourquoi ne peut tu pas utiliser un STD::vector ?? j'ai pas compris

  8. #8
    Membre confirmé Avatar de matteli
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 85
    Par défaut
    Qui peut le plus, peut le moins.

    Donc je pourrai utiliser vector, seulement je m'étais dit qu'il fallait réserver les vecteurs pour les tableaux dynamique et les tableau C++ pour ceux de taille fixe et défini avant la compil.

    C'est sans doute bête. Surtout que les vecteurs sont vraiment très sympa à utiliser.

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Peut etre comprendrais tu mieux le fonctionnement s'il l'avait écrit sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int proType[65536];
    for(int* i = 0; i < 65536; ++i)
    {
       proType[i]=9;
    }


    Simplement, au lieu de passer par l'indice du tableau (ce que je trouve quand même plus facile à lire), il est passé par "le pointeur sur l'élément".

    En effet, quand tu déclare unsigned int proType[65536], proType sans rien représente l'adresse de l'élément 0 du tableau, et donc, (proType+65536) correspond à l'adresse de fin de ce tableau.

    L'instruction à l'intérieur de la boucle dit tout simplement qu'il faut fournir la valeur 9 "à l'élément qui se trouve à l'adresse" de itr

    Ceci dit, et d'un avis strictement personnel, il n'y a strictement aucune raison à n'utiliser les std::vector que pour des tableaux de taille variables, surtout si le tableau de taille fixe est encapsulé dans une classe personnelle.

    en effet, avec une classe du genre de
    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
    26
    27
    28
    29
    30
    class LaClass
    {
        publc:
            /* le constructeur qui initialise les éléments du tableau
             * à 0 par défaut
             */
            LaClass():tab(65536,0){}
            /* le constructeur qui initialise les élément du tableau
             * à une valeur fournie par l'utilisateur
             */
            LaClass(int val):tab(65536,val){}
            ~LaClass(){}
            /* on ne fournis que deux méthodes pour y accéder
             */
            /* l'operateur [] pour acces en lecture seule
             */
            const int operator[] (size_t index) const
            {
                 assert (index<65536);
                 return tab[index];
            }
            /* et une méthode permettant de modifier une valeur */
            void modify(size_t index, size_t value)
            {
                assert (index<65536);
                tab[index]=value;
            }
        private:
            std::vector<size_t> tab;
    };
    cache tout à fait le fait que tu utilise un std::vector

    Enfin, et c'est encore mon avis personnel, mais la "peur de ne pas savoir se servir d'une bibliothèque" est sans doute le pire ennemi du programmeur:

    En effet, ta "peur" est finalement relativement irraisonnée, vu que tu trouveras facilement de l'aide sur la plupart des bibliothèques, surtout si elles sont aussi généralisée que boost.

    Ta peur te mettra dans une situation où tu va décider délibérément de perdre ton temps à faire (sans doute mal) tout seul quelque chose qui a été fait (sûrement mieux) par toute une équipe, au lieu de t'inquiéter de ce qui est vraiment important.

    Maintenant, il n'est pas question de t'obliger à quoi que ce soit non plus
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre confirmé Avatar de matteli
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 85
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Peut etre comprendrais tu mieux le fonctionnement s'il l'avait écrit sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int proType[65536];
    for(int* i = 0; i < 65536; ++i)
    {
       proType[i]=9;
    }


    Simplement, au lieu de passer par l'indice du tableau (ce que je trouve quand même plus facile à lire), il est passé par "le pointeur sur l'élément".

    En effet, quand tu déclare unsigned int proType[65536], proType sans rien représente l'adresse de l'élément 0 du tableau, et donc, (proType+65536) correspond à l'adresse de fin de ce tableau.

    L'instruction à l'intérieur de la boucle dit tout simplement qu'il faut fournir la valeur 9 "à l'élément qui se trouve à l'adresse" de itr

    Ceci dit, et d'un avis strictement personnel, il n'y a strictement aucune raison à n'utiliser les std::vector que pour des tableaux de taille variables, surtout si le tableau de taille fixe est encapsulé dans une classe personnelle.

    en effet, avec une classe du genre de
    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
    26
    27
    28
    29
    30
    class LaClass
    {
        publc:
            /* le constructeur qui initialise les éléments du tableau
             * à 0 par défaut
             */
            LaClass():tab(65536,0){}
            /* le constructeur qui initialise les élément du tableau
             * à une valeur fournie par l'utilisateur
             */
            LaClass(int val):tab(65536,val){}
            ~LaClass(){}
            /* on ne fournis que deux méthodes pour y accéder
             */
            /* l'operateur [] pour acces en lecture seule
             */
            const int operator[] (size_t index) const
            {
                 assert (index<65536);
                 return tab[index];
            }
            /* et une méthode permettant de modifier une valeur */
            void modify(size_t index, size_t value)
            {
                assert (index<65536);
                tab[index]=value;
            }
        private:
            std::vector<size_t> tab;
    };
    cache tout à fait le fait que tu utilise un std::vector

    Enfin, et c'est encore mon avis personnel, mais la "peur de ne pas savoir se servir d'une bibliothèque" est sans doute le pire ennemi du programmeur:

    En effet, ta "peur" est finalement relativement irraisonnée, vu que tu trouveras facilement de l'aide sur la plupart des bibliothèques, surtout si elles sont aussi généralisée que boost.

    Ta peur te mettra dans une situation où tu va décider délibérément de perdre ton temps à faire (sans doute mal) tout seul quelque chose qui a été fait (sûrement mieux) par toute une équipe, au lieu de t'inquiéter de ce qui est vraiment important.

    Maintenant, il n'est pas question de t'obliger à quoi que ce soit non plus
    ok je comprends mieux. C'est le ++i de la boucle qui m'avais dérangé. J'imagine que c'est plutot ++itr.

    Pour ce qui est de Boost, je compte bien m'y mettre. Seulement, je fais actuellement mon premier programme en c++ et je viens de VB6, c'est à dire beaucoup de changement pour moi. J'y vais mollo pour l'instant et n'inclu pas tout d'un seul coup.

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par matteli Voir le message
    ok je comprends mieux. C'est le ++i de la boucle qui m'avais dérangé. J'imagine que c'est plutot ++itr.
    oui, il fallait lire ++itr... une faute d'attention de la part de Floréal
    Pour ce qui est de Boost, je compte bien m'y mettre. Seulement, je fais actuellement mon premier programme en c++ et je viens de VB6, c'est à dire beaucoup de changement pour moi. J'y vais mollo pour l'instant et n'inclu pas tout d'un seul coup.
    Tu n'a pas tord, dans le fond "qui va lentement, va surement"

    habitue toi bien avec la S(T)L, mais garde en tête le fait que boost est particulièrement bien fourni et efficace (une bonne partie de boost devrait d'ailleurs être inclue dans la prochaine norme )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 35
    Dernier message: 14/02/2006, 18h57
  2. Réponses: 7
    Dernier message: 31/01/2006, 22h34
  3. initialiser un tableau 2D dans le main
    Par miminou dans le forum C++
    Réponses: 5
    Dernier message: 20/12/2005, 10h35
  4. [LG] Jeu mémory : initialisation de tableau
    Par DarkLords dans le forum Langage
    Réponses: 1
    Dernier message: 19/10/2005, 15h13
  5. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30

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