Bonjour,
Comment initialiser un tableau d’entier ? Est-ce que le nombre de tableau est limité dans un programme ?
Bonjour,
Comment initialiser un tableau d’entier ? Est-ce que le nombre de tableau est limité dans un programme ?
Initialisation d'un tableau statique (sur la pile) :
Si la taille du tableau n'est pas précisée, le compilateur utilise le nombre d'éléments passés à cette initialisation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int tableau[4] = {1,2,3,4};
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.
Salut,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:
est aussi juste que
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::string str="bonjour";
ou encore que
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::strng w("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
1
2
3std::string s; s="hello world";
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 )
Code : Sélectionner tout - Visualiser dans une fenêtre à part int tab[]={1,2,3,4,5,6,7,8,9,10,11};
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
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.
Auteur blondelle le 01/06/10, forum C++ "perdre une partie de donnée avec la conversion"
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 }
Cordialement.de toute facon le C++ est une extension du C
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)
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
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)
ou je me repete le format NRC qui est plus efficace que multi_array
"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)
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager