Exercices corrigés PascalConsultez toutes les sources

Nombre d'auteurs : 3, nombre de sources : 49, dernière mise à jour : 6 mars 2008 

 
OuvrirSommairePointeurs

Si il est un point délicat dans la programmation sous DOS, c'est bien celui-ci. Car même si les ordinateurs modernes possèdent parfois jusqu'à plusieurs Giga-octets de mémoire, DOS n'a été conçu que pour en utiliser un Méga-octet seulement. Et à l'intérieur de ce méga-octet, une partie définie est réservée pour le fonctionnement interne de DOS, il ne reste donc que 640 Ko de mémoire dynamique pour que les programmes puissent s'exécuter correctement.


Mémoire dynamique oui, car il existe pour un programme deux types de mémoire : la mémoire statique, où sont stockées toutes les variables qui ont été déclarées lors de la compilation, et la mémoire dynamique, qui permet donc de définir des variables créées lors de l'exécution du programme. L'avantage de la mémoire dynamique, par rapport à la mémoire statique, est qu'elle permet d'adapter la zone de mémoire utilisée au programme qui s'exécute : en effet, on pourra par exemple créer en mémoire une zone spéciale qui ne pourrait servir qu'à un traitement ponctuel, mais dont la taille ne pourrait contenir dans un segment de 64 kilo-octets. Car 64 kilo-octets est la limite pour la taille d'une variable en mémoire statique, cette limite n'existant pas pour la mémoire dynamique, qui permet d'allouer de plus grands espaces.


Malheureusement, la taille de ma mémoire dynamique est fixe, soit 640 kilo-octets, ce qui peut parfois entraîner des désagréments lors de l'exécution (des erreurs se produisent lorsqu'ils n'y a plus d'espace mémoire disponible mais ceci reste relativement rare). Pour contrer cette contrainte peu réjouissante, l'objectif est de gérer correctement nos moyens pour réserver et libérer des espaces en mémoire dynamique.


Cette gestion passe par les pointeurs : les pointeurs sont des variables pouvant être statiques ou dynamiques (stockées sur quatre octets) qui représentent un lien vers un espace de la mémoire dynamique. Il existe donc au minimum un petit espace de quatre octets réservés en mémoire et représentant un lien vers une zone de mémoire dynamique. Pour allouer et libérer de l'espace, nous disposons de deux couples d'instructions : GetMem/FreeMem et New/Dispose.


La première paire permet, à partir d'un pointeur donné, de réserver ou libérer un espace en mémoire dynamique : la taille de l'espace à allouer ou libérer est cependant spécifiée, ce qui permet par exemple de créer des zones de mémoire tampon pour le traitement spécifique de données.


Le second jeu d'instructions permet plus spécifiquement de réserver des zones destinées à contenir des éléments précis, comme par exemple des enregistrements ou des objets. La taille n'est alors pas passée en paramètre, et le compilateur alloue ou libère la zone concernée avec la taille qu'il aura définie. Ceci s'utilise généralement avec les pointeurs sur enregistrements ou les pointeurs sur objets : le programmeur évite donc de se soucier de la taille d'un enregistrement ou d'un objet. Les nouvelles versions des instructions new et dispose permettent également de passer en paramètre des méthodes spéciales, appelées constructeurs et destructeurs, ce qui facilite grandement la tâche du programmeur (ceci sera abordé lors des exercices sur les objets).

Créé le 21 juillet 2004  par Mathieu Dalbin

On décide de réserver dynamiquement un espace de données en mémoire. La taille de cet espace devra être suffisante afin de contenir une image récupérée avec la fonction GetImage de l'unité Graph. La taille de l'image est récupérée avec la fonction ImageSize. Après avoir récupéré et réaffiché l'image, la zone mémoire sera libérée.

point1.pas
CacherSélectionnez
Créé le 21 juillet 2004  par Mathieu Dalbin

En reprenant l'exercice sur l'annuaire téléphonique, déclarer un type pointeur sur l'enregistrement, et créer dynamiquement en mémoire plusieurs enregistrements, et les remplir avec des données acquises au clavier. On demandera à l'utilisateur les données nécessaires et on créera un enregistrement pour chaque entrée.

point2.pas
CacherSélectionnez
Créé le 21 juillet 2004  par Mathieu Dalbin

On décide de créer une liste chaînée contenant des entiers. Définir les types nécessaires pour la mise en œuvre de cette liste chaînée, et prévoir deux procédure ou fonctions pour ajouter une valeur et afficher le contenu de la liste. Remplir la chaîne avec quelques valeurs. Enfin écrire une procédure pour vider la liste et libérer l'espace mémoire qui lui était associé.

point3.pas
CacherSélectionnez
Créé le 21 juillet 2004  par Mathieu Dalbin

On décide de créer à présent une liste chaînée bidirectionnelle à partir de la liste précédente. Créer les types nécessaires pour la mise en œuvre d'une liste chaînée bidirectionnelle. On prévoit trois procédures : la première pour ajouter une valeur en tête de liste, la deuxième pour afficher la liste à l'écran, et la troisième pour vider la liste et libérer l'espace mémoire.

point4.pas
CacherSélectionnez
Créé le 21 juillet 2004  par Mathieu Dalbin

On décide de créer un arbre binaire afin d'organiser nos données, constituées de variables de type entier. Définir les types nécessaires pour la mise en oeuvre de cet arbre, et remplir les premières feuilles de l'arbre avec quelques valeurs. Ici aussi trois procédures, pour ajouter un nombre, afficher sommairement l'arbre et enfin libérer la mémoire.

point5.pas
CacherSélectionnez
Créé le 21 juillet 2004  par Mathieu Dalbin