- Limite virtuelle de la mémoire.
- Passage d'un paramètre à un sous-programme.
1. Limite virtuelle de la mémoire.
Une fois compilé (commande Run,
Compile ou Make), un programme
gère la mémoire très rigoureusement. Le tableau ci-dessous vous montre que les variables principales,
les variables locales des sous-programmes et les pointeurs ne sont pas stockés dans les mêmes parties
de la mémoire. En effet, les variables principales de font la part belle, la mémoire allouée aux pointeurs
(très gourmands en mémoire) est variable et celle destinée aux variables locales est assez restreinte.
| | Pile (Stack) 16 ko par défaut | Destiné aux variables locales des sous-programmes (procédures, fonctions) ainsi qu'aux valeurs passées par valeur aux sous-programmes. |
| | Tas (Heap) de 0 à 640 ko | Réservé aux pointeurs. |
| | Segment de données 64 ko | Destiné aux variables du programme principal. |
Explications : les sous-programmes étant destinés à des
calculs intermédiaires, ils n'ont guère besoins d'ébnormément de ressource mémoire. Quand aux pointeurs que
l'on verra dans les chapitres suivant, ils sont destinés à la manipulation d'une grande quantité de données.
Mais il est toutefois possible de modifier manuellement une telle
organisation de la mémoire afin, par exemple, de privilégier la Pile grâce au commentaire de compilation
suivant : {$M n1, n2, n3}.
Ce type de commentaire est destiné au compilateur Borland Pascal qui
inscrira les informations spécifiées dans le programme compilé. Un commentaire de compilation se présente entre
accolades comme n'importe quel autre commentaire, mais un signe dollar "$" signifie qu'il est destiné au
compilateur. Quand au "M" il dit au compilateur qu'on souhaite réorganiser la disposition de la mémoire
à l'aide des valeurs n1, n2 et n3 qui spécifient respectivement la taille en kilo octets de la
Pile (doit être inférieur à 64 ko), la taille minimale et la taille maximale (inférieur à 640 ko) du Tas.
Mais pourquoi s'enquiquiner avec ça ? Tout simplement parce qu'il
pourra vous arriver d'avoir insuffisament de mémoire à cause d'un tableau trop long par exemple. Si vous déclarer une telle
variable dans une prodédure :
Var tableau : Array[1..50, 1..100] Of Real ;
vous obtiendrez le message d'erreur n°22 : Structure too large qui veut dire
que votre variable tient trop de place pour être stockée dans la mémoire allouée. Car en effet, ce tableau tient :
50 * 100 * 6 octets = 29 ko ( 1 ko = 2^10 = 1024 octets) 29 ko > 16 ko donc le compilateur renvoit une erreur. Et
le seul moyen qui vous reste est de modifier les valeurs correspondantes aux grandeurs allouées à la Pile par
un commentaire de compilation ou en allant dans le menu Option/Memory Size.
D'où l'intérêt du Chapitre 4 ("Différents types de variables") qui vous indique la taille de chaque type de variable.
2. Passage d'un paramètre à un sous-programme.
Dans le Chapitre 7 ("Procédures et
sous-programmes") vous avez appris qu'on pouvait passer un paramètre par valeur ou bien par adresse à une
procédure paramétrée. Vous avez également compris l'intérêt de la syntaxe Var dans la déclaration
d'une prodédure. Quand un sous-programme est appelé, le programme compilé réalise en mémoire (dans la Pile)
une copie de chaque argument passé au sous-programme. Ces copies ne sont que temporaires puisque destinées au
fonctionnement de sous-programmes qui n'interviennent que temporairement dans le programme. Ainsi un changement de
valeur au sein de la procédure d'un paramètre passé par adresse sans la syntaxe Var n'est pas
répercuté dans le programme principale. Alors que dans le cas de la présence de la syntaxe Var,
le programme ne duplique pas la valeur ainsi passée à la procédure dans la Pile, mais le paramètre du
sous-programme et la variable principale (passée comme argument à la procédure) sont joints vers la zone de la mémoire
de la variable principale (dans la partie Segment de données). Ainsi toute variation interne à la procédure est répercuté directement sur l'argument
(la variable du programme principal passé en parmètre).
|