BlueGEEK Journal

Accueil > Manip’s > Delphi > Tableaux > DELPHI : Gestion des Tableaux

Delphi, Tableau, Dynamique

DELPHI : Gestion des Tableaux

Array, Setlength, Low, High, Copy

dimanche 23 décembre 2007, par bluegyn_spip

- Un tableau est une liste de lignes

  • Chaque ligne contient une donnée (par exemple une phrase)

- Un texte (comme ce message) est une liste de lignes,

  • Il est donc possible de placer ce texte dans un tableau
    • Chaque cellule du tableau contiendra de haut en bas, une ligne du texte.

Nb : Un tableau dynamique est un pointeur, (c’est à dire une simple adresse) il est donc nécessaire pour l’équilibre du système que le programme alloue et désalloue en permanence la mémoire nécessaire au stockage des données dans ce tableau, puis rende la mémoire quand le tableau ne sert plus.

- Si l’allocation mémoire doit être explicitement demandée par le programmeur

- La désallocation est le plus souvent automatique et implicite (la mémoire est restituée dès que la fonction s’éteint")

- Mais le programmeur peut à tout moment récupérer l’espace occupé par un gros tableau.


1°) Comment déclarer un Tableau ?

- Déclarer un tableau c’est créer un pointeur vers une zone mémoire

SYNTAXE

var A : Array of string ; // Soit A un Tableau de Lignes

A est donc l’adresse du tableau, or une adresse ne contient rien, il faut donc allouer de la mémoire au tableau pour y placer des données


2°) Comment allouer de la mémoire au Tableau A ?

SetLength ( A , 32000 ) ;

- Je libère derrière l’adresse de A assez de mémoire pour contenir 32000 lignes

- Une fois le tableau utilisé je dois rendre au système la mémoire inutilisée


3°) Comment récupérer la mémoire occupée par un Tableau ?

A := Nil ; // J’efface simplement l’adresse de A (pointeur NUL)


4°) Comment placer une valeur dans un Tableau ?

- Par son indice :

A [ 0 ] := ’ceci est ma ligne 1’ ;

- Le premier indice d’un tableau (ma première ligne) porte le numéro Zéro


5°) Comment lire une ligne dans un Tableau ?

maLigne1 := A [ 0 ] ;


6°) Comment compter le nombre de lignes d’un Tableau ?

Taille := Length ( A ) ;


7°) Comment savoir ou est la première et la dernière ligne d’un Tableau ?

- Première ligne = Instruction Low :

Ligne_PREM := A [ Low(A) ] ; (équivalent A [0] ; )

- Dernière ligne = Instruction High :

Ligne_DERN := A [ High (A) ] ; (équivalent A [ length(A)-1 ] ;

- Ce qui donne pour parcourir de haut en bas un Tableau de taille inconnue

for i := Low(A) to High(A) do ...


8°) Comment redéfinir la Taille d’un Tableau ?

- Un Tableau est une adresse, il ne contient donc aucune donnée, il est donc très facile (avec delphi) d’élargir ou de raccourcir la zone de mémoire qu’il désigne

SetLength ( A , 255 ) ; // Repasse le tableau de 32000 lignes à 255, tout ce qui est après la ligne 255 est tronqué

- C’est donc la même instruction pour allouer et réallouer


9°) Comment recopier un tableau dans un autre ?

- Soit 2 Tableaux A et B (var A, B : array of string ; )

  • Ecrire A := B ;
    • veut dire que A et B ont la même adresse, car on rappelle qu’un tableau est un pointeur vers une adresse

- B n’est donc pas la copie de A mais son Alias (ou son miroir) "B est A" c’est la même chose sous 2 noms différents

- Si je modifie A, B est également modifié et si je modifie B, A est également modifié, ce qui n’a pas grand intérêt en pratique

- Si je veux obtenir une vraie PHOTOCOPIE de A pour pouvoir travailler dessus sans modifier l’original, je dois écrire

B := Copy ( A ) ;


10°) Comment recopier un Mémo dans un Tableau

- Soit un Tableau Dynamique B :

var B : Array of string ;

- Je compte le nombre de ligne du Mémo

max := memo1.Lines.Count ;

- Je réserve la mémoire correspondante au nombre de lignes pour mon Tableau B

SetLength ( B, max ) ;

- Je remplis les lignes de mon Mémo dans mon Tableau

for i := 0 to max-1 do B[i] := Memo1.lines[i] ;

Max est diminué de 1 car je commence à 0 et non à 1