|
1 | 1 | ### **EPITECH PROJECT, 2024** |
2 | | -**CVector - Workshop** |
| 2 | +**CVector - Workshop** |
| 3 | + |
| 4 | +--- |
| 5 | + |
| 6 | +### **Introduction aux macros et à leur utilité dans la compilation** |
| 7 | + |
| 8 | +Les macros sont des directives préprocesseur en C qui permettent de substituer un texte ou une expression directement dans le code source avant la compilation. Contrairement aux fonctions, les macros ne génèrent pas d'appel supplémentaire à l'exécution, ce qui peut améliorer les performances dans certains cas. |
| 9 | + |
| 10 | +**Pourquoi utiliser les macros ?** |
| 11 | +1. **Abstraction et lisibilité** : Les macros rendent le code plus clair en encapsulant des opérations complexes ou répétitives. |
| 12 | +2. **Éviter les erreurs répétées** : Les macros garantissent une uniformité en remplaçant systématiquement les parties du code concernées. |
| 13 | +3. **Faciliter les opérations sur des types génériques** : Elles permettent d'écrire des fonctions ou des structures réutilisables sans connaître à l'avance le type manipulé. |
| 14 | + |
| 15 | +Dans le contexte de ce projet, les macros jouent un rôle central dans l'accès et la gestion des propriétés du vecteur dynamique. Par exemple, les macros définies dans `cvector.h` permettent d'abstraire des opérations comme la récupération de la taille ou de la capacité d'un vecteur dynamique, tout en utilisant efficacement `sizeof` pour travailler avec des types génériques. |
| 16 | + |
| 17 | +Prenons l'exemple suivant tiré du sujet : |
| 18 | +```c |
| 19 | +#define vector_size(v) ((v) ? ((vector_header_t *)((char *)(v) - sizeof(vector_header_t)))->size : 0) |
| 20 | +``` |
| 21 | +Cette macro calcule la taille actuelle du vecteur (le nombre d'éléments qu'il contient). Voici comment elle fonctionne : |
| 22 | +1. Si le vecteur `v` est valide (non NULL), elle : |
| 23 | + - Cast le pointeur du vecteur `v` en un pointeur `char *` pour effectuer des calculs d'adressage. |
| 24 | + - Soustrait `sizeof(vector_header_t)` pour accéder à l'en-tête du vecteur. L'en-tête est placé juste avant les données pour stocker des métadonnées comme la taille et la capacité. |
| 25 | + - Cast le résultat en un pointeur vers `vector_header_t` pour accéder à ses champs. |
| 26 | + - Retourne la valeur du champ `size`. |
| 27 | +
|
| 28 | +2. Si le vecteur `v` est NULL, la macro retourne `0`. |
| 29 | +
|
| 30 | +Ainsi, cette macro encapsule une opération complexe (calculer la taille en mémoire d'un vecteur générique) dans une expression lisible et réutilisable. |
| 31 | +
|
| 32 | +--- |
| 33 | +
|
| 34 | +### **Contexte** |
| 35 | +Le but de ce projet est de développer une implémentation en C d'un vecteur dynamique similaire à `std::vector` en C++. Vous devrez compléter un fichier d'en-tête partiellement rempli et implémenter les fonctions principales dans différents fichiers `.c`. |
| 36 | +
|
| 37 | +Le vecteur dynamique devra permettre : |
| 38 | +1. L'allocation dynamique de mémoire. |
| 39 | +2. L'ajout, la suppression et le redimensionnement des éléments. |
| 40 | +3. La gestion explicite de la mémoire. |
3 | 41 |
|
4 | 42 | --- |
5 | 43 |
|
|
0 commit comments