Copy of https://perso.isima.fr/loic/unixc/tpc-06.php
tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
Institut d'informatique ISIMA
  • twitter
  • linkedin
  • viadeo

[C] Structures particulières

Date de première publication : 2023/10/25

Dans ce TP, il s'agit de tester les "structures particulières" que permet le C.

Enumérations

Définir une énumération semaine et vérifier que l'on peut faire une petite boucle (mais attention, elle ne marche que parce que les valeurs sont consécutives :-)).

Vous pouvez afficher une valeur d'une énumération mais vous aurez une valeur entière. Pour débogage, il faut utiliser un tableau de chaines de caractères ou une macro de génération.

Définir une deuxième énumération pour les mois de l'année. Vérifier qu'il n'est pas possible de faire :

enum semaine jour = FEVRIER;

Cette "impossibilité" n'est pas une erreur mais un simple avertissement ! Mais vous avez compilé avec -Wall -Wextra alors vous avez vu le message du compileur.

Vous pouvez également vérifier que deux énumérations différentes ne peuvent définir le même "champ".

Champs de bits

Cette structure qui s'applique uniquement sur des champs entiers permet de préciser le nombre de bits nécessaires pour coder une information.

En général, on spécifie la couleur d'un pixel d'un écran en mélangeant trois couleurs : le rouge, le vert et le bleu (auxquelles on peut associer une transparence encore nommée alpha). Ça tombe bien nos yeux auraient au moins trois types de récepteurs : un pour chacune de ces couleurs (les cônes). On discrétise les niveaux de couleurs en 256 niveaux, ce qui fait tout de même plus de 16 millions de couleurs possibles, ce qui est pas mal du tout !

Déclarer une structure de 3 entiers et calculer la taille nécessaire pour stocker une image décompressée affichée sur un écran de dimensions de 3024 pixels de large par 1964 pixels de haut.

3 * sizeof(int) * 3028 * 1964 = sizeof(structure) * 3028 * 1964

Calculer maintenant la taille requise si on utilise un champ de bits avec la même configuration et le gain que cela représente ! Pour "rappel", voici la syntaxe :

struct couleur {
    int r:8;
    int v:8;
    int b:8;
};

On s'attend à ce que le taille du champ de bits soit de 3 octets en mémoire. Pour des questions d'alignement mémoire, on peut avoir une valeur supérieure mais la valeur sera de toute façon inférieure à la taille de la structure avec 3 int

Unions

Vérifications

Définir les variables suivantes :


struct paire_s { int a; double b;} s1;
union  paire_u { int a; double b;} u1;

Afficher l'espace mémoire nécessaire pour stocker s1 et u1 et comparer...

Afficher les champs a et b après ces affectations :


s1.a = 5;
s1.b = 10.0;

u1.a = 5;
u1.b = 10.0;

Que constatez-vous ?

Vous pouvez également afficher les adresses des différents champs :


printf("%p %p %p %p", &u1.a, &u1.b, &s1.a, &s1.b);
u1.b = 10.0;

De la manipulation...

Il s'agit de coder la structure de donnée "point" vue en cours. Un point peut être représenté sous forme cartésienne ou polaire :


struct cartesien {
    double x;
    double y;
};

et


struct polaire {
    double r;
    double t;
};

La structure point doit mémoriser le type de représentation choisie et les coordonnées.

Vous vérifierez que l'on ne peut pas créer une structure ou une union avec le même "nom" :


struct nom {};
union  nom {};

Les constantes mentionnées ci-dessus sont définies dans math.h, ainsi que les fonctions trigonométriques dont on a besoin pour les conversions. Il ne faut pas oublier d'ajouter l'option -lm à l'édition des liens.