Préambule
Ce TP concerne la création et la manipulation maîtrisée des objets nécessaires à la bonne marche d'un programme. Ce dernier doit pouvoir créer et manipuler de nouveaux types (i.e non fournis par le langage), il peut avoir besoin, rarement, d'objets connus par toutes ses instructions ou, de façon plus courante, d'objets connus uniquement à l'intérieur d'un contexte donné (principe d'encapsulation), enfin il doit avoir connaissance à tout instant des objets existants et de ceux qui ont cessé de l'être.
Exercice 1 : définition du type ``boolean``.
Cette définition se fait en deux temps :
- création des constantes TRUE et FALSE
- création du type énuméré boolean comportant les deux identificateurs, dans l'ordre, FALSE et TRUE
Il est à noter que ce type existe dans la norme du C99 (voir le fichier d'en-têtes stdbool.h).
Exercice 2 : un type structuré.
- Définissez le type information, comportant les champs :
- instancie (un booléen qui indique si l'information est instanciée),
- nom (une chaîne de 40 caractères qui renseigne l'information),
- emplacement (une chaîne de 20 caractères qui indique dans quelle portion du programme est l'information),
- quantite (un entier qui donne le nombre d'information du même type existant),
- Déclarez une variable de type information et initialisez-la (i.e instancie à TRUE, nom et emplacement à des valeurs choisies par vous, quantite à 1).
Exercice 3 : tout par valeur.
- Implantez une fonction qui affiche une information existante ; cette fonction ne devant pas avoir d'incidence sur le reste du programme il faut donc lui transmettre un paramètre de type information par valeur.
- Instanciez une autre information par affectation de l'information définie à l'exercice 2 puis affichez les deux informations. Modifiez le 1er caractère du nom de la 1ère information puis affichez à nouveau les 2 informations : à quoi aurait-on pu s'attendre vis à vis des champs de type chaînes de caractères ? Expliquez.
- Implantez une fonction qui retourne une information créée localement (i.e dans la fonction) et affichez la valeur de retour (dans le main() par exemple). Qu'en déduisez-vous ?
Exercice 4 : tout par adresse.
- Déclarez un tableau de 10 information et initialisez tous ses éléments (i.e instancie à FALSE, nom et emplacement à la chaîne vide, quantite à 0).
- Implantez une fonction qui permet d'instancier un élément du tableau d'information puis utilisez-la pour les 3 premiers éléments de votre tableau afin de les initialiser à diverses valeurs.
- Déclarez un pointeur sur une information puis affectez lui l'adresse du 2ième élément de votre tableau d'information, enfin affichez les valeurs de ses attributs.
- Implantez une fonction qui alloue dynamiquement une information, initialise ses champs et renvoie un pointeur sur cet objet, puis initialisez le pointeur de la question précédent par un appel à cette fonction et affichez l'élément qu'il pointe.
Exercice 5 : durée de vie.
Recopiez la fonction suivante :
void encore()
{
information echo = {TRUE, "un echo", "encore()", 1};
printf("%d\n", echo.quantite);
++echo.quantite;
}
Faites appel à deux reprises à cette fonction puis modifiez la déclaration de la variable en : static information echo = ... et faites à nouveau appel à la fonction. Conclusion ?
Exercice 6 : visibilité.
Recopiez le bloc suivant (au début de votre main() par exemple) :
{ information infoloc = {TRUE, "infoloc", "un bloc du main()", 1}; } printf("%s\n", infoloc.nom);
Conclusion ?
Recopiez le programme suivant (en complétant avec la définition de type) :
information info = {TRUE, "visible", "global", 1}; void f(information info) { information info = {TRUE, "visible", "f()", 3}; printf("%d\n", info.quantite); } int main() { information info = {TRUE, "visible", "main()", 2}; f(info); }
Ajoutez d'autres demandes d'affichage, identique à celle existante dans la fonction f(), dans le programme. Conclusion (le compilateur vous aide pour l'un des cas) ?