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 :

A propos des tableaux


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 41
    Points
    41
    Par défaut A propos des tableaux
    Bonjour,
    Comment initialiser un tableau d’entier ? Est-ce que le nombre de tableau est limité dans un programme ?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 69
    Points : 142
    Points
    142
    Par défaut
    Initialisation d'un tableau statique (sur la pile) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tableau[4] = {1,2,3,4};
    Si la taille du tableau n'est pas précisée, le compilateur utilise le nombre d'éléments passés à cette initialisation.

    Note que c'est plutôt du C : il n'y a pas encore de conteneur C++ particulier aux tableaux de taille fixe...Il y en aura dans la prochaine version (C++11) et probablement déjà dans Boost.

    Si tu veux des tableaux dynamiques (taille variable), il vaut mieux utiliser les conteneurs plus sécurisés de la librairie standard (valarray).


    Concernant la taille limite d'un tableau (ou le nombre limite de tableaux, ça revient plus au moins au même finalement...) "ça dépend" :
    - dans le cas d'un tableau statique, ça dépend de la taille allouée à la pile, qui par défaut peut être assez basse, attention !
    - dans le cas de tableaux dynamiques la librairie standard propose toujours une fonction membre (ça doit être max_size) qui permet de connaître la capacité maximale allouable : elle dépend de la plate-forme.

  3. #3
    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 Pierre Dolez Voir le message
    Bonjour,

    Avant d'être initialisé, un tableau doit être déclaré.
    Si on connait sa dimension au moment de la compilation, on peut le déclarer de la façon la plus simple, ou déclaration de son pointeur:
    Si ce n'est qu'une initialisation (quelle que soit la manière dont elle s'effectue) peut parfaitement être utilisée en même temps que la déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string str="bonjour";
    est aussi juste que
    ou encore que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string s;
    s="hello world";
    et, en ce qui concerne les tableau statiques, tu peux, effectivement, envisager l'initialisation au moment de la déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tab[]={1,2,3,4,5,6,7,8,9,10,11};
    La seule chose étant que (comme tout tableau statique) tu sera alors limité quant au nombre d'éléments qu'il peut contenir, qui sera calculé sur base... du nombre d'éléments donné lors de l'initialisation (tab[11] est en dehors de l'espace mémoire réservé pour tab, selon l'exemple )
    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

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    (Après avoir perdu le message que j'avais soigneusement tapé, je me contenterai d'un bout de code exemple et d'une citation)
    Déclaration, initialisation et libération de la mémoire.
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <exception>
    #include <iostream>
     
    using std::cout;
    using std::endl;
    void display(long double **);
    void de_allocate(long double **);
     
    int m = 3; // LE NOMBRE DE LIGNES.
    int n = 5; // LE NOMBRE DE COLONNES.
     
    int main(void) {
       long double **data;
     
       try { // TEST POUR LES EXCEPTIONS.
          data = new long double*[m]; // ETAPE 1: INITIALISE LES LIGNES.
          for (int j = 0; j < m; j++)
              data[j] = new long double[n]; // ETAPE 2: INITIALISE LES COLONNES
     
          }
       catch (std::bad_alloc) { // ENTREZ CE BLOC SEULEMENT SI bad_alloc EST DECLENCHE.
          // VOUS POUVEZ AVOIR BESOIN D'AUTRES ACTIONS AVANT DE TERMINER
          cout << "Allocation impossible. Au revoir ...";
          exit(-1);
          }
     
       for (int i = 0; i < m; i++)
          for (int j = 0; j < n; j++)
              data[i][j] = i + j; // INITIALISATION ARBITRAIRE
     
       display(data);
       de_allocate(data);
       return 0;
       }
     
    void display(long double **data) {
     
       for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++)
                 cout << data[i][j] << " ";
           cout << "\n" << endl;
           }
       }
     
    void de_allocate(long double **data) {
       for (int i = 0; i < m;  i++)
           delete[] data[i]; // ETAPE 1: SUPPRIMER LES COLONNES
     
       delete[] data;        // ETAPE 2: SUPPRIMER LES LIGNES
     
       }
    Auteur blondelle le 01/06/10, forum C++ "perdre une partie de donnée avec la conversion"
    de toute facon le C++ est une extension du C
    Cordialement.

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Les tableaux types T*** sont casses geules à initialiser et à manipuler, ne résistent pas aux exceptions.

    La solution. passer par un std::vector qui permettrait d'émuler un tableau 2D/3D/ ou sinon passer par boost::multi_array

    Pour le PO.
    Un tableau statique (cad T[N]) est alloué sur la pile : sa taille sera limité par celle de ta pile (souvent 1 ou 2 Mo)

    Par contre les tableaux dynamique (std::vector) ne sont limités que la RAM libre contiguë que tu as.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Invité
    Invité(e)
    Par défaut
    L'une des innovations fondamentale du C et par héritage du C++ est l'allocation dynamique de la mémoire.
    Remplir la pile par des constantes me parait dommage, et n'est plus tellement utilisée à ma connaissance.
    S'il s'agit de constantes, par exemple de coefficients, il y a deux solutions, soit les valeurs sont stockées dans un fichier qui sera lu si nécessaire, soit à l'initialisation du module concerné, le tableau contenant les dites valeurs sera déclaré en dynamique, puis initialisé avec les valeurs stockées en dur.
    L'allocation de tableau dynamique, quelque soit le nombre de dimensions ne me parait pas tellement dangereuse, en considérant qu'à un instant donné du code, le tableau en cours, c'est à dire la partie de tableau, est un pointeur.

    Autrement dit, que conseiller à notre ami al9000? Il est vrai que sa question est un peu vague

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu fais comment pour coder un code exception safe avec T*** ?

    Je me répète, la solution c'est la facilité (et le RAII en prime) de std::vector pour un tableau 1D dynamique ou boost::array/std::array si le tableau doit avoir une taille constante.

    Pour des tableaux à multiple dimension, c'est boost::multi_array ou encore l'émulation via un vector de taille m*n.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    ou je me repete le format NRC qui est plus efficace que multi_array

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par Joel F Voir le message
    ou je me repete le format NRC qui est plus efficace que multi_array
    NRC ? Késako ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  10. #10
    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
    Du D. Knuth. Op op un petit exemple :

    http://www.developpez.net/forums/d92...l/#post5220175
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

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

Discussions similaires

  1. Est ce que ce syntaxe est juste ?( a propos des tableaux)
    Par lahdili.reda dans le forum Langage
    Réponses: 7
    Dernier message: 20/06/2012, 13h56
  2. Question a propos des tableaux javascript et selecteur d'id, merci d'avance
    Par jchris51 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/10/2008, 17h21
  3. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30
  4. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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