Skip to content

Commit 2442c8d

Browse files
Create Bootstrap.md
1 parent 53ffcc0 commit 2442c8d

File tree

1 file changed

+204
-0
lines changed

1 file changed

+204
-0
lines changed

src/Bootstrap.md

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
### **EPITECH PROJECT, 2024**
2+
**CVector - Sujet pédagogique**
3+
4+
---
5+
6+
### **Contexte**
7+
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`.
8+
9+
Le vecteur dynamique devra permettre :
10+
1. L'allocation dynamique de mémoire.
11+
2. L'ajout, la suppression et le redimensionnement des éléments.
12+
3. La gestion explicite de la mémoire.
13+
14+
---
15+
16+
### **Objectifs**
17+
1. Compléter le fichier d’en-tête `cvector.h` en remplissant les parties marquées comme `TODO`.
18+
2. Implémenter les fonctions manquantes dans les fichiers suivants :
19+
- `cvector_core.c`
20+
- `cvector_insert_erase.c`
21+
- `cvector_resize.c`
22+
3. Tester votre implémentation avec des cas simples et des assertions.
23+
24+
---
25+
26+
### **Fichier `cvector.h`**
27+
28+
Voici le fichier partiellement complété que vous devrez modifier :
29+
30+
```c
31+
#ifndef CVECTOR_H
32+
#define CVECTOR_H
33+
34+
#include <unistd.h>
35+
#include <stdlib.h>
36+
#include <string.h>
37+
#include <stdbool.h>
38+
#include <stdio.h>
39+
40+
#define VECTOR_SUCCESS 0
41+
#define VECTOR_FAILURE 1
42+
43+
/**
44+
* @brief Structure for the vector header.
45+
* Similar to std::vector, it only stores size and capacity.
46+
* Data starts immediately after this structure.
47+
*/
48+
typedef struct {
49+
size_t size; // Number of elements currently in the vector
50+
size_t capacity; // Total capacity allocated
51+
size_t initial_capacity;
52+
} vector_header_t;
53+
54+
#if defined(__GNUC__) || defined(__clang__)
55+
#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
56+
#else
57+
#define WARN_UNUSED_RESULT
58+
#endif
59+
60+
// Access the vector header
61+
#define VECTOR_HEADER(v) (TODO) // Complétez cette macro pour accéder à l'en-tête du vecteur
62+
63+
// Get the size of the vector
64+
#define vector_size(v) ((v) ? (TODO) : 0) // Complétez pour retourner la taille actuelle du vecteur
65+
66+
// Get the capacity of the vector
67+
#define vector_capacity(v) ((v) ? (TODO) : 0) // Complétez pour retourner la capacité totale
68+
69+
// Check if the vector is empty
70+
#define vector_empty(v) (TODO) // Implémentez une condition pour vérifier si le vecteur est vide
71+
72+
// Get a pointer to the underlying data
73+
#define vector_data(v) (TODO) // Complétez pour retourner un pointeur vers les données
74+
75+
// Get the first element
76+
#define vector_front(v) ((v) ? (v) : NULL)
77+
78+
// Get the last element
79+
#define vector_back(v) ((v) && vector_size(v) > 0 ? (TODO) : NULL) // Complétez pour retourner le dernier élément
80+
81+
// Create a new vector of type T with initial capacity c
82+
#define VECTOR(T, c) ((T*)(TODO)) // Complétez pour initialiser un nouveau vecteur
83+
84+
// Push back n elements (from pointer val) to the vector
85+
#define vector_push_back(v, val, n) (TODO) // Complétez pour ajouter des éléments au vecteur
86+
87+
// Pop back n elements
88+
#define vector_pop_back(v, n) (TODO) // Complétez pour retirer des éléments du vecteur
89+
90+
// Clear the vector (size = 0, but doesn't change capacity)
91+
#define vector_clear(v) (TODO) // Complétez pour réinitialiser la taille à 0
92+
93+
// Destroy the vector completely (free memory)
94+
#define vector_destroy(v) (TODO) // Complétez pour libérer la mémoire allouée au vecteur
95+
96+
#ifdef __cplusplus
97+
extern "C" {
98+
#endif
99+
100+
void *vector_init(size_t item_size, size_t capacity) WARN_UNUSED_RESULT;
101+
void *vector_ensure_capacity(void *v, size_t item_count, size_t item_size) WARN_UNUSED_RESULT;
102+
int vector_push_back_impl(void **v, const void *val, size_t n, size_t item_size) WARN_UNUSED_RESULT;
103+
void vector_pop_back_impl(void **v, size_t n, size_t item_size);
104+
int vector_resize_impl(void **v, size_t new_size, size_t item_size);
105+
int vector_shrink_to_fit_impl(void **v, size_t item_size);
106+
int vector_insert_impl(void **v, size_t index, const void *val, size_t count, size_t item_size) WARN_UNUSED_RESULT;
107+
void vector_erase_impl(void **v, size_t index, size_t count, size_t item_size);
108+
109+
#ifdef __cplusplus
110+
}
111+
#endif
112+
113+
#endif // CVECTOR_H
114+
```
115+
116+
---
117+
118+
### **Fichier `cvector_core.c`**
119+
120+
Dans ce fichier, implémentez les fonctions principales du vecteur dynamique. Voici les squelettes des fonctions :
121+
122+
```c
123+
#include "cvector.h"
124+
125+
void *vector_init(size_t item_size, size_t capacity)
126+
{
127+
// TODO : Implémentez la logique pour initialiser un vecteur
128+
}
129+
130+
void *vector_ensure_capacity(void *v, size_t item_count, size_t item_size)
131+
{
132+
// TODO : Implémentez la logique pour garantir la capacité
133+
}
134+
135+
int vector_push_back_impl(void **v, const void *val, size_t count, size_t item_size)
136+
{
137+
// TODO : Implémentez l'ajout d'éléments à la fin
138+
}
139+
140+
void vector_pop_back_impl(void **v, size_t count, size_t item_size)
141+
{
142+
// TODO : Implémentez la suppression des éléments en fin de vecteur
143+
}
144+
```
145+
146+
---
147+
148+
### **Fichier `cvector_insert_erase.c`**
149+
150+
Dans ce fichier, implémentez les fonctions d'insertion et de suppression.
151+
152+
```c
153+
#include "cvector.h"
154+
155+
int vector_insert_impl(void **v, const size_t index, const void *val, const size_t count, size_t item_size)
156+
{
157+
// TODO : Implémentez la logique pour insérer des éléments
158+
}
159+
160+
void vector_erase_impl(void **v, const size_t index, size_t count, const size_t item_size)
161+
{
162+
// TODO : Implémentez la logique pour supprimer des éléments
163+
}
164+
```
165+
166+
---
167+
168+
### **Fichier `cvector_resize.c`**
169+
170+
Dans ce fichier, implémentez les fonctions de redimensionnement.
171+
172+
```c
173+
#include "cvector.h"
174+
175+
int vector_resize_impl(void **v, const size_t new_size, const size_t item_size)
176+
{
177+
// TODO : Implémentez la logique pour redimensionner le vecteur
178+
}
179+
180+
int vector_shrink_to_fit_impl(void **v, const size_t item_size)
181+
{
182+
// TODO : Implémentez la logique pour réduire la capacité
183+
}
184+
```
185+
186+
---
187+
188+
### **Instructions**
189+
190+
1. **Complétez les `TODO` :**
191+
- Remplissez les parties manquantes dans chaque fichier.
192+
- Respectez les signatures des fonctions.
193+
194+
2. **Compilez et testez :**
195+
- Créez un fichier `main.c` pour tester toutes les fonctionnalités.
196+
- Utilisez des cas simples pour valider chaque opération.
197+
198+
3. **Critères d’évaluation :**
199+
- Toutes les fonctionnalités doivent fonctionner correctement.
200+
- La gestion de la mémoire doit être efficace et sans fuites.
201+
202+
---
203+
204+
Ce sujet vous permet de travailler sur un concept fondamental de la programmation : la gestion dynamique de la mémoire. Si vous avez des questions ou souhaitez des clarifications, n’hésitez pas à demander.

0 commit comments

Comments
 (0)