Exemple : le tableau (… encore d’entier)

  • Récupérez le fichier intvector.h. Ce fichier contient les prototypes de certaines opérations usuelles sur les tableaux.
  • Créez un fichier intvector.c et implémentez les fonctions nécessaires.
  • En parallèle, créez un fichier main.c pour tester vos fonctions.
  • Enfin pour ne pas vous embêter à compiler ce programme, créez un fichier Makefile contenant les lignes suivantes : (Attention $(CC) et rm sont précédés d’une tabulation et non d’espaces)
CFLAGS=-std=c99 -Wall
testivector: main.o intvector.o
clean:
	rm -f *.o testivector
  • Compilez : make
  • Testez : ./testivector
#ifndef __IVECTOR_H
#	define __IVECTOR_H

struct intvector;

/**
 * Initialise le vecteur ``v''
 */
struct intvector iv_new();

/**
 * Retourne le nombre d'element contenu dans ``v''
 */
int iv_size(struct intvector *v);

/**
 * Le vecteur ``v'' est-il vide ?
 */
int iv_empty(struct intvector *v);

/**
 * Le vecteur ``v'' est-il plein ?
 */
int iv_full(struct intvector *v);

/**
 * Retourne le ``idx''-eme element de ``v''
 */
int iv_get(struct intvector *v, int idx);

/**
 * Remplace le ``idx''-eme element de ``v''
 */
void iv_set(struct intvector *v, int idx, int value);

/**
 * Ajoute ``value'' a la fin du tableau
 */
void iv_add(struct intvector *v, int value);

/**
 * Retourne l'index de la premiere occurence de ``value'', -1 si elle n'est pas trouvee
 */
int iv_indexof(struct intvector *v, int value);

/**
 * Retire le ``idx''-eme element sans laisser de trou.
 */
void iv_removeat(struct intvector *v, int idx);

/**
 * Copie ``length'' elements de ``src'' a partir de ``s_idx'' dans ``dst'' en debutant a ``d_idx''.
 * ``dst'' doit etre assez grand pour recevoir les elements, son contenu anterieur est ecrase.
 */
void iv_copy(struct intvector *src, struct intvector *dst, int *s_idx, int *d_idx, int length);
#endif

Dans votre fichier de test implémentez une fonction qui trie un tableau par ordre croisant (voir correction pg-101 1 ou 2).

Exemple (suite) : Les tableaux dynamiques

On souhaite améliorer nos tableaux pour qu’ils puissent grandir à la demande. Ceci permet au tableaux contenants peu d’éléments d’occuper peu de mémoire, tout en autorisant les très gros tableaux.

Rajoutez dans intvector.c les fonctions suivantes :

static void enlarge(struct intvector *v);

void compact(struct intvector *v);

Le mot clé static (devant une fonction) veut dire qu’elle ne sera pas visible hors de ce fichier. Ceci permet de cacher les détails de l’implémentation ainsi que de donner des noms plus courts puisqu’ils ne seront pas soumis à conflits.

Pour implémenter ces fonctions vous aurez besoin de fonctions contenues dans stdlib.h :

malloc
Alloue un bloc mémoire
free
Libère un bloc mémoire précédemment alloué
realloc
Redimensionne le bloc passé en paramètre, l’opération peut retourner un nouveau bloc.

Pour s’entrainer (ou du moins réfléchir)

Proposez une alternative à l’utilisation des tableaux comme backing store de nos vecteurs d’entiers.