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 :

Initialisation de la taille d'un array


Sujet :

C++

  1. #1
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 597
    Points : 886
    Points
    886
    Par défaut Initialisation de la taille d'un array
    Bonjour.
    Je souhaite pouvoir choisir la taille d'un array d'entiers en fonction du choix de l'utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    #include <array>
     
    int main() {
    	int taille;
    	std::cout << "taille ?";
    	std::cin >> taille;
    	std::array<int, taille> mon_tableau;
    	return 0;
    }
    ne fonctionne pas car "taille" n'est pas une constante. Comment faire ?
    Participez vous aussi !
    Message utile
    Discussion résolue

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ypcman Voir le message
    Comment faire ?
    std::vector

  3. #3
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 597
    Points : 886
    Points
    886
    Par défaut
    Certes, mais je veux rester sur des tableaux statiques et donc ne pas employer vector.
    Il s'agit juste de pouvoir choisir la taille à l'initialisation et non en dur dans le code
    Participez vous aussi !
    Message utile
    Discussion résolue

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ypcman Voir le message
    Certes, mais je veux rester sur des tableaux statiques et donc ne pas employer vector.
    Les tableaux statiques ont toujours 1 taille codée en dur (à la compilation)
    1 technique est de surdimensionner son tableau pour éviter l'allocation dynamique.

    Le C a les VLA, variable-length array (<- lien wikipedia en anglais) ... qui sont dépréciés depuis le C11.
    Quid du C++ ?

  5. #5
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 597
    Points : 886
    Points
    886
    Par défaut
    Bien pris. Donc même avec std::array, on en reste à la bonne vieille méthode d'une allocation maxSize constante et de l'emploi d'une partie de ce gros tableau en fonction du besoin.
    Participez vous aussi !
    Message utile
    Discussion résolue

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ypcman Voir le message
    Bien pris. Donc même avec std::array, on en reste à la bonne vieille méthode d'une allocation maxSize constante et de l'emploi d'une partie de ce gros tableau en fonction du besoin.
    std::array est juste 1 classe qui englobe 1 tableau statique
    1. sa documentation en anglais
    2. 1 implémentation, celle de libstdc++


    Et c'est son but il me semble : avoir des tableaux statiques en C++ via 1 classe container
    Internally, an array does not keep any data other than the elements it contains (not even its size, which is a template parameter, fixed on compile time). It is as efficient in terms of storage size as an ordinary array declared with the language's bracket syntax ([]). This class merely adds a layer of member and global functions to it, so that arrays can be used as standard containers.

    Unlike the other standard containers, arrays have a fixed size and do not manage the allocation of its elements through an allocator: they are an aggregate type encapsulating a fixed-size array of elements. Therefore, they cannot be expanded or contracted dynamically (see vector for a similar container that can be expanded).

  7. #7
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Citation Envoyé par foetus Voir le message
    Le C a les VLA, variable-length array (<- lien wikipedia en anglais) ... qui sont dépréciés depuis le C11.
    Quid du C++ ?
    La réponse est simple, ça n'existe pas.

  8. #8
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Citation Envoyé par ypcman Voir le message
    Bien pris. Donc même avec std::array, on en reste à la bonne vieille méthode d'une allocation maxSize constante et de l'emploi d'une partie de ce gros tableau en fonction du besoin.
    Pourquoi pas std::vector<>::reserve ?

  9. #9
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 597
    Points : 886
    Points
    886
    Par défaut
    Kaitlyn, c'est juste pour ma compréhension personnelle de ce qui est faisable ou non avec les tableaux statiques.

    Pourtant, si on n'utilise pas std::array on peut définir dynamiquement la taille d'un tableau ie créer un tableau d'une taille choisie après la compilation. Ce code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    #include <array>
     
    int main() {
    	int *Tab, taille;
    	std::cout << "taille ?";
    	std::cin >> taille;
    	Tab = (int *)malloc(sizeof(int) * taille);
     
    	return 0;
    }
    j'ai l'impression qu'avec std::array, on perd cette possibiiité
    Participez vous aussi !
    Message utile
    Discussion résolue

  10. #10
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Non cette possibilité existe, elle s'appelle std::vector<> comme déjà dit.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ypcman Voir le message
    j'ai l'impression qu'avec std::array, on perd cette possibiiité
    Je ne vois pas ce que tu ne comprends pas

    1 tableau statique a 1 taille fixe parce qu'il est alloué sur la pile ("stack" en anglais) - comme les variables locales ou les paramètres d'1 fonction/ procédure/ méthode.
    C'est pour cela que 1) tu ne peux pas modifier sa taille 2) tu peux faire planter ton programme à l'exécution avec 1 "stack overflow" (<- lien wikipedia en français)

    1 allocation dynamique (malloc en C, new/ new[] en C++) alloue sur le tas ("heap" en anglais)

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ton dernier code n'est pas un tableau statique.
    définir dynamiquement la taille d'un tableau
    Tu comprends ce que tu écris ?
    statique = défini et fixé à la compialtion = std::array<Type, Taille> values ou Type values[Taille].
    dynamique = à l'exécution = std::vector ou alloué avec malloc.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    std::array n'est pas indispensable. D'ailleurs il n'existait pas avant C++11. C'est un peu une version restreinte de std::vector.

  14. #14
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 597
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Tu comprends ce que tu écris ?
    statique = défini et fixé à la compilation = std::array<Type, Taille> values ou Type values[Taille].
    dynamique = à l'exécution = std::vector ou alloué avec malloc.
    Je comprends surtout que je faisais manifestement la salade entre les concepts sans avoir bien compris le lien statique/compilation et dynamique/éxécution.
    c'est plus clair maintenant ,merci
    Participez vous aussi !
    Message utile
    Discussion résolue

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par ypcman Voir le message
    Certes, mais je veux rester sur des tableaux statiques et donc ne pas employer vector.
    Il s'agit juste de pouvoir choisir la taille à l'initialisation et non en dur dans le code
    D'accord, c'est ton choix.

    Puis-je simplement te demander pourquoi

    Quel raisonnement as tu suivi pour en arriver à te dire que tu ne voulais pas utiliser std::vector

    D'autant plus que là, tu te heurtes à deux volontés totalement opposées:
    • d'un coté, tu ne veux pas avoir la possibilité de définir la taille de ton tableau à l'exécution (car, soyons clair, c'est ce que le choix de ne pas utiliser std::vector t'impose)
    • et, de l'autre coté, tu ne veux pas définir la taille de ton tableau "en dur" à la compilation

    Seulement, voilà... Y a pas vraiment d'autre choix, car la compilation et l'exécution sont les deux seules grosses périodes pendant lesquelles tu pourra agir sur le résultat généré par le compilateur à partir de ton code, la compilation permettant de modifier le résultat obtenu, l'exécution permettant d'envoyer des instructions au processeurs pour qu'elles soient exécutées.

    En conclusion, ben, il y a un moment où il faut peut-être décider "d'homogénéiser" ses décisions

    NOTA: De plus, std::vector fournit énormément de possibilités (comme la fonction reserve, qui ... réserve directement un espace donné, comme la possibilité de définir un allocateur personnalisé, ou le simple fait que la mémoire allouée est systématiquement doublé lorsque le nombre d'éléments atteint la capacité maxiale, de manière à retarder le moment où il deviendra nécessaire d'allouer encore plus de mémoire) qui en font sans doute "le meilleur choix" à partir du moment où la taille ne pourra être indiquée qu'à l'exécution
    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

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    std::array n'est pas indispensable. D'ailleurs il n'existait pas avant C++11. C'est un peu une version restreinte de std::vector.
    Non, en fait, c'est plus une version améliorée de type valeur[MAX_ELEMENTS], dans le sens où elle présente des fonctions membres destinées à en sécuriser l'usage
    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

  17. #17
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 597
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    D'accord, c'est ton choix.

    Puis-je simplement te demander pourquoi

    Quel raisonnement as tu suivi pour en arriver à te dire que tu ne voulais pas utiliser std::vector
    Ce n'est pas du tout que je ne voulais pas utiliser std::vector ,mais plutôt que je pensais, à tort, que std::array surcouchait l'ensemble du périmètre d'emploi des tableaux et que donc, j'aurais pu déclarer un std::array<type, nosize> et ensuite, avec une méthode surcouchant malloc(), allouer de la place pour ce tableau. J'ai bien compris maintenant que cette librairie std::array est exclusivement dédiée aux tableaux à allocation de mémoire statique et que std::vector est dévolue à l'allocation dynamique.
    Participez vous aussi !
    Message utile
    Discussion résolue

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Lors de la conception du C++14, un template std::dynarray<> (qui avait une taille fixe une fois créé, mais cette taille pouvait être choisie à l'exécution) avait été envisagé, mais apparemment cette idée a été abandonnée.
    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.

  19. #19
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Citation Envoyé par koala01 Voir le message
    Non, en fait, c'est plus une version améliorée de type valeur[MAX_ELEMENTS], dans le sens où elle présente des fonctions membres destinées à en sécuriser l'usage
    Ce n'est pas contradictoire ! Et il faut bien justifier l'introduction de std::array par un petit plus quelque part. Mais n'hésite pas à développer ce rapport sécurité / fonctions membres pour qu'on sache exactement à quoi tu fais allusion.

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ypcman Voir le message
    J'ai bien compris maintenant que cette librairie std::array est exclusivement dédiée aux tableaux à allocation de mémoire statique et que std::vector est dévolue à l'allocation dynamique.
    Bof tu te trompes

    La liste des containers standards, lien cplusplus en anglais
    Tous les containers peuvent modifier leur structure à l'exécution (dynamique) sauf le std::array qui englobe 1 tableau statique dans 1 classe container (depuis le C++11)

    Pour faire simple, je pense que l'idée est de cacher "la partie langage C" sous 1 couche C++. Mais en le rendant container, il a accès aux manipulations STL: itérateurs, échange, ...
    Et puisque tu sembles ne rien connaître aux containers, 1 std::vector te garantie 1 espace contigu pour des données de même type (<- std::vector<void*> existe mais son utilité en C++ me semble être très très à la marge)


    Citation Envoyé par kaitlyn Voir le message
    La réponse est simple, ça n'existe pas.
    Effectivement, je m'interrogeais sur le fait si on pouvait appeler des spécificités du compilateur C en C++. Et on ne peut pas le faire.
    Et en cherchant, je suis tombé sur ce que dit @Médinoc, la proposition N3810 de 2013 de Bjarne Stroustrup

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2013, 18h24
  2. Augmenter taille d'un array de +1.
    Par Yakuzan dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 28/03/2009, 15h27
  3. Taille Array, 255 max?
    Par StreetJeopardy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/06/2006, 09h43
  4. [Array]Initialisation de propriété
    Par Jean_Benoit dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/05/2006, 17h44
  5. Tableau(Array) sans taill
    Par krfa1 dans le forum ASP
    Réponses: 4
    Dernier message: 21/09/2005, 22h31

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