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 �m�rite Avatar de ypcman
    Homme Profil pro
    Retrait� codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    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 : 601
    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 ?

  2. #2
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Citation Envoy� par ypcman Voir le message
    Comment faire ?
    std::vector

  3. #3
    Membre �m�rite Avatar de ypcman
    Homme Profil pro
    Retrait� codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    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 : 601
    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

  4. #4
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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 �m�rite Avatar de ypcman
    Homme Profil pro
    Retrait� codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    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 : 601
    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.

  6. #6
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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 Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    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 Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    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 �m�rite Avatar de ypcman
    Homme Profil pro
    Retrait� codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    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 : 601
    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�

  10. #10
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    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 599
    Par d�faut
    Non cette possibilit� existe, elle s'appelle std::vector<> comme d�j� dit.

  11. #11
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    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 �m�rite Avatar de ypcman
    Homme Profil pro
    Retrait� codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    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 : 601
    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

  15. #15
    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,
    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
    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 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 �m�rite Avatar de ypcman
    Homme Profil pro
    Retrait� codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    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 : 601
    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.

  18. #18
    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
    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 Expert
    Femme Profil pro
    ..
    Inscrit en
    D�cembre 2019
    Messages
    679
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 95
    Localisation : Autre

    Informations professionnelles :
    Activit� : ..

    Informations forums :
    Inscription : D�cembre 2019
    Messages : 679
    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 confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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