Les tableaux

Fermé
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014 - 3 juil. 2014 à 00:20
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 6 juil. 2014 à 15:13
Bonjour,

est ce qu'on ne peut pas utiliser un tableau sans définir sa taille initialement parce que je veux que sa taille varie après ?????? et si c vrai alors pourquoi il y a des cours qui parle de l'ajout dans un tableau, je comprend que si on ajoute un élément la taille du tableau va augmenter !! ilya un paradox ici !!!!!

3 réponses

yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 2
3 juil. 2014 à 00:42
bon je ne comprends pas bien ta question mais je sai qu'a la declaration d un tableau on fixe une taille grande initialement qui est superieure a la taille voulue 

Mais si tu cherches un tableau sans definir la taille dans ce cas on parle de liste chainee c est un tableau dynamque qui n a pas de taille et on peut y inserer tant d element qu on souhaite!

                
0
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014
3 juil. 2014 à 01:16
yedez je peut fixer une taille maximale de 100 par exemple et mon tableau contient 7 elements, je veux ajouter que 3 éléments et la taille du tableau devient 10 element. c'est possible ?
0
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014
3 juil. 2014 à 01:21
yedez et je pense que si je travail avec les tableaux dynamiques et j'alloue des cases qui ne seront pas utilisé ça va prendre beaucoup d'espace dans la mémoire que l'utilisation des listes chaînées, non ?
0
yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 2
3 juil. 2014 à 01:28
pour la 1ere question oui tu peux fixer une taille de 100 elements alors que tu n as besoin que de 10 elements et Cést ca l inconvenient des tableaus statiques enfaite mai les listes chaine C'est una utre concept ca ne prendra pas d espace supplimentaire

    
0
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014
3 juil. 2014 à 01:35
merci yedez
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
4 juil. 2014 à 09:55
Bonjour,

Huum, il est bon de bien préciser parce que, dans nombre de langages la gestion mémoire est un problème central!
En fait il faut simplement se représenter que toute allocation mémoire retourne un bloc simple d'octets contigus, c'est à dire que lorsqu'on alloue un tableau de 10 éléments de 100 octets, au moins 1000 octets sont alloués, les éléments étant accessible en multipliant par 100 l'index voulu, ce que le langage fait lui-même lorsqu'on utilise le tableau.
Donc une fois ce bloc alloué en mémoire centrale, d'autres blocs peuvent être alloués à sa suite et on ne peut donc pas dépasser la taille initiale, cependant, les langages proposent généralement une fonction de réallocation, permettant de redimensionner le tableau en le copiant dans un nouveau bloc de mémoire.
En clair:
- Soit le nombre maximal d'éléments à placer est connu et petit, dans ce cas on peut se contenter de conserver le tableau à sa taille maximale;
- Soit le tableau peut varier dans de grandes proportions, mais change très rarement et à des instants non critiques, dans ce cas on peut réallouer à chaque modification.
- Soit le nombre d'éléments est fréquemment modifié et très volatile petit ou grand, dans ce cas on peut réallouer le tableau, mais en gardant une marge. C'est à dire que lorsqu'on est obligé de l'agrandir, il faut l'agrandir dans des proportions suffisantes de manières à anticiper un nouveau dépassement, et pareillement en le réduisant, il faut garder une marge de manière à ne pas devoir l'agrandir une µs après... Les marges à adopter dépendent de l'utilisation typique du tableau, et les fonctions de réallocation intègrent également une marge.

Ensuite pour ce qui est des listes chaînées, hé bien, c'est déjà dépendant de l'usage! Un tableau linéaire et une liste chaînée ayant chacun leurs avantages et leurs inconvénients, mais l'utilisation tend à être différente! Si on souhaite accéder rapidement à chaque élément, le tableau s'impose dans la plupart des cas; Tandis que si on souhaite pouvoir retirer et ajouter des éléments au sein des autres, la liste chaînée prend l'avantage... mais on peut aussi insérer des éléments au sein d'un tableau (mais c'est coûteux en déplacements), et entretenir un tableau de pointeurs sur chaque noeud d'une liste chaînée, mais il faut déplacer les pointeurs en cas d'insertion ou suppression d'éléments..

Et il faut aussi savoir que chaque bloc de mémoire allouée contient un "header", un espace mémoire réservé en usage interne, donc le fait d'allouer des blocs multiples consomme de la mémoire; Dans le cas d'une liste chaînée, si on alloue un bloc de mémoire pour chaque noeud, chaque élément de la liste contiendra le header du bloc mémoire (16 octets en général) plus les pointeurs de liste...
Mais, on peut économiser le header sur chaque noeud en plaçant les éléments dans un tableau déjà alloué, et c'est beaucoup plus rapide que de solliciter le gestionnaire de mémoire pour chacun.

Donc la liste chaînée s'impose pour sa flexibilité, chaque élément est plus imposant mais on alloue idéalement que ce qui est nécessaire; De plus, elle est très adaptée aux éléments de taille variable et aux objets chaînés.
Le tableau lui, permet un accès rapide aux éléments et est économe en mémoire, mais il autorise peu de souplesse en ajout/suppression en dehors de l'empilement, pas plus qu'au niveau de la taille des éléments contenus.

Bon courage!
0
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014
6 juil. 2014 à 00:34
merci
0
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014
6 juil. 2014 à 00:35
SVP, vous savez comment coder un tableau dont chaque case contient un tableau ?
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
6 juil. 2014 à 15:13
Hé bien, un tableau n'est rien d'autre qu'une suite d'éléments -de même taille généralement- donc, une chaîne de caractère est un tableau de caractère, n'est ce pas? Lorsqu'on déclare un tableau de chaînes de caractères de taille finie, on déclare bel et bien un tableau de tableaux...
Une image est un tableau(X) de tableaux(Y) de tableaux(Rgb)...
La mémoire ram est un tableau d'octets...
Un dword est un tableau de 4 octets...

On peut considérer que chaque tableau contient une liste d'enregistrements, quelle que soit la nature et taille de ces enregistrements; le tableau lui-même occupe donc un espace mémoire suffisant pour accueillir le nombre d'éléments contenu multiplié par la taille d'un élément.

En fait le tableau n'est qu'un moyen de lier des éléments entre eux en les regroupant les uns à la suite des autres en mémoire, il suffit donc ensuite de savoir la taille d'un élément pour accéder à chacun d'eux en toute simplicité...
Ensuite l'usage reste très souple, selon les besoins; Par exemple on a besoin d'un tableau contenant une centaine d'images de 1Mo, alors:

- Soit on déclare un tableau de 100 éléments de 1Mo:
- Le tableau totalise 100Mo en mémoire.
- Les éléments seront difficilement déplaçables;
- Même si on ne conserve que 50 images, tout l'espace mémoire est occupé;

- Soit on déclare un tableau de 100 éléments de 4 octets, pointant sur chaque image:
- Le tableau occupe 400 octets en mémoire, les images sont déclarées dans d'autres blocs mémoire perdant un petit peu d'espace en plus de leur taille;
- Les pointeurs du tableau peuvent assez facilement être déplacés, il est facile de supprimer et d'insérer un élément au sein des autres;
- Deux éléments du tableau peuvent pointer sur la même image sans le doublon en mémoire;
- La mémoire consacrée aux images n'est allouée qu'en fonction du besoin;

Donc dans le cas de gros éléments, le tableau de pointeurs convient généralement mieux, sauf si rien ne varie en cours d'utilisation à la rigueur...

Ensuite, en dehors du choix du type de tableau à utiliser selon chaque cas, la manière de le déclarer est fonction du langage! Mais généralement c'est très simple, par exemple en delphi il suffit d'écrire:

Var Tableau: Array[0..99, 0..9] of Byte;

pour obtenir un tableau de 100*10 de byte.
0