#include #include #include #include #include #include "vector.h" /** Renvoie un pointeur vers un nouveau vecteur vide ou bien NULL s'il y a eu un probleme. */ struct vector_t *newVec() { struct vector_t *pv = calloc(sizeof(struct vector_t), 1); return pv; } /** Libere toutes les structures de donnees accessible a partir de pv. Libere egalement la zone pointee par pv */ void deleteVec(struct vector_t *pv) { // TODO A completer par les etudiants // Corrigé Question 1.4 int i; for (i = 0 ; i < pv->nbElem ; i++) { free(pv->elem[i]); pv->elem[i] = NULL; } free(pv->elem); pv->elem = NULL; pv->nbElem = 0; free(pv); } /** Ajoute une copie de la string s a la fin du vecteur pv. Renvoie le rang dans le vecteur de la chaine ajoutee ou bien -1 s'il y a eu un problème. */ int pushBack(struct vector_t *pv, char *s) { // Corrigé Question 1.3 char** ptr = malloc(sizeof(char*) * (pv->nbElem+1)); if(!ptr) return -1; memcpy(ptr, pv->elem, (pv->nbElem)*sizeof(char*)); free(pv->elem); pv->elem = ptr; pv->elem[pv->nbElem] = malloc(strlen(s)+1); if (pv->elem[pv->nbElem] == NULL) { return -1; } strcpy(pv->elem[pv->nbElem], s); pv->nbElem++; return pv->nbElem - 1; } /** Renvoie l'element place a la case rank dans pv ou NULL si rank est en dehors des bornes de pv. */ char *getElem(const struct vector_t *pv, int rank) { if ((rank < 0) || (rank >= pv->nbElem)) { return NULL; } return pv->elem[rank]; } /** Cree un nouveau vecteur en initialisant son contenu avec les informations trouvees dans le fichier de nom filename. S'il y a un souci dans l'acces au fichier filename, affiche un message d'erreur et renvoie NULL. NB : le fichier est structure de la maniere suivante - Les 4 premiers octets contiennent le nombre, ecrit en binaire, d'elements du vecteur - Ensuite, pour chaque element du vecteur, il y a 4 octets contenant la longueur, ecrite en binaire, que doit avoir la zone memoire pour stocker la chaine de caracteres qui va etre lue ensuite (NB : cette longueur prend en compte le '\0' final), puis les octets de la chaine de caracteres (y compris le '\0' final). */ struct vector_t *loadVec(char *filename) { struct vector_t *pv = NULL; // Inutile pour l'exercice 1 return pv; } /** Sauvegarde le vecteur pv dans le fichier binaire de nom filename (format du fichier explique dans loadVec). Renvoie 0 si tout s'est bien passe et -1 sinon (apres avoir affiche un message d'erreur explicatif) */ int saveVec(struct vector_t *pv, char *filename) { // Inutile pour l'exercice 1 return 0; }