1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#define PADDING 0x1 /* 1 */
#define MAX_SIZE 0x32 /* 50 */
/*
* Structure avec
* structures anonymes
* volentairement definis ainsi
*/
struct ts_AnonymAnimal {
struct {
char nom[MAX_SIZE];
char race[MAX_SIZE];
unsigned short age;
} info;
};
/*
* Structures pour les
* différents animaux
* sans anonymat
*/
struct ts_Serpent {
char nom[MAX_SIZE];
char race[MAX_SIZE];
unsigned short age;
};
struct ts_Araigne {
char nom[MAX_SIZE];
char race[MAX_SIZE];
unsigned short age;
};
/*
* Structure globale pour
* les animaux sans anonymat
*/
struct ts_NoAnonymAnimal {
struct ts_Serpent serpent;
struct ts_Araigne araigne;
};
void fnc_indent(int level) {
for (int i = 0x0; i < level; ++i) {
(void)fprintf(stdout, " ");
}
}
void fnc_printSizeInfo(const char *name, size_t size) {
(void)fprintf(stdout, "%s : %zu octets\n",
name, size);
}
void fnc_printAnimalInfo(int level, const char *animalName,
const char *nom, const char *race,
unsigned short age, size_t size) {
fnc_indent(level);
(void)fprintf(stdout, "%s :\n", animalName);
fnc_indent(level + PADDING);
(void)fprintf(stdout, "Nom : %s\n", nom);
fnc_indent(level + PADDING);
(void)fprintf(stdout, "Race : %s\n", race);
fnc_indent(level + PADDING);
(void)fprintf(stdout, "Age : %hu\n", age);
fnc_printSizeInfo("Taille de la structure", size);
// Taille de chaque élément de la structure
fnc_printSizeInfo("Taille de char nom",
sizeof(((struct ts_AnonymAnimal *)0)->info.nom));
fnc_printSizeInfo("Taille de char race",
sizeof(((struct ts_AnonymAnimal *)0)->info.race));
fnc_printSizeInfo("Taille de unsigned short age",
sizeof(((struct ts_AnonymAnimal *)0)->info.age));
}
int main(void) {
// Exemple avec structures anonymes
struct ts_AnonymAnimal chien = {
.info = {"Milou", "Border", 5}};
struct ts_AnonymAnimal panda = {
.info = {"Picha", "Pango", 15}};
printf("Info Structure Anonyme :\n");
fnc_printAnimalInfo(PADDING, "Chien",
chien.info.nom, chien.info.race,
chien.info.age, sizeof(struct ts_AnonymAnimal));
fnc_printAnimalInfo(PADDING, "Panda",
panda.info.nom, panda.info.race,
panda.info.age, sizeof(struct ts_AnonymAnimal));
/* Exemple sans structures anonymes */
struct ts_NoAnonymAnimal serpent = {
.serpent = {"Kaa", "Python", 5}};
struct ts_NoAnonymAnimal araigne = {
.araigne = {"Bagheera", "Araignee", 15}};
(void)fprintf(stdout, "\nInfo Structure No Anonyme :\n");
fnc_printAnimalInfo(PADDING, "Serpent",
serpent.serpent.nom, serpent.serpent.race,
serpent.serpent.age, sizeof(struct ts_NoAnonymAnimal));
fnc_printAnimalInfo(PADDING, "Araignee",
araigne.araigne.nom, araigne.araigne.race,
araigne.araigne.age, sizeof(struct ts_NoAnonymAnimal));
size_t sizeAnonym = sizeof(struct ts_AnonymAnimal);
size_t sizeNoAnonym = sizeof(struct ts_NoAnonymAnimal);
// Comparaison des tailles
if (sizeAnonym < sizeNoAnonym) {
(void)fprintf(stdout,
"\x1b[31mLa structure avec structure anonyme est plus petite.\x1b[0m\n");
} else if (sizeAnonym > sizeNoAnonym) {
(void)fprintf(stdout,
"\x1b[31mLa structure sans struture anonyme est plus petite.\x1b[0m\n");
} else {
(void)fprintf(stdout,
"\x1b[31mLes deux structures ont la même taille.\x1b[0m\n");
}
return EXIT_SUCCESS;
} |
Partager