Prototypes des fonctions en langage C
La traduction des fonctions du TAD set
en langage C doit tenir compte des particularités du langage de programmation: effet de bords, mécanisme de passage des paramètres, allocation des variables, etc. Pour chaque paramètre d’entrée et chaque valeur de sortie, il faut choisir le mécanisme de passage de paramètre le plus cohérent dans le langage C.
Les exercices suivants demandent de prendre du recul sur les choix réalisés lors de l’écriture du fichier set.h
et de les justifier. Vous répondrez aux questions dans ce fichier, dans votre dépôt.
TAD
- À quoi fait référence le terme abstrait dans le concept de ``Type Abstrait de Données’’?
- Quels aspects différencient les mises en œuvre d’un TAD?
- Pourquoi chercher à écrire un algorithme (ou à le programmer en langage C) à partir d’un TAD?
- Dans la mise en œuvre que vous avez réalisée, pourquoi mettre le tableau dans une structure au lieu de l’utiliser directement comme paramètre, par exemple:
int set__add(int * s, int i)
?
set__is_empty
- Donner les prototypes de la fonction
set__is_empty
correspondant aux deux passages de paramètres possibles. - Sur un exemple, montrer qu’il est préférable d’avoir un passage par adresse pour le paramètre d’entrée.
- Pourquoi le passage par adresse ne correspond pas à la description (au comportement) de cette opération dans le TAD? Justifier l’utilisation du mot-clé
const
dans le prototype de la fonction.
set__add
- Pourquoi est-il possible, en langage C, d’avoir un prototype de la fonction
set__add
qui n’a pas de valeur de retour? - Pourquoi avoir choisi de retourner une valeur entière? Lister tous les cas d’utilisation que vous avez mis en œuvre.
set__empty
La fonction set__empty
initialise un ensemble vide.
- Le TAD n’indique pas le mode d’allocation mémoire. Deux modes sont possibles: allocation par le TAD ou allocation par l’utilisateur du TAD. Il y a alors trois prototypes possibles pour la fonction:
struct set * set__empty();
struct set set__empty();
void set__empty(struct set *);
À quel mode d’allocation mémoire correspond chacun de ces prototypes? Montrer qu’avec le premier prototype une allocation sur la pile n’est pas correcte.
On choisit que l’allocation des
struct set
soit faite par l’utilisateur du TAD. Par exemple dans la fonctionmain
:int main() { struct set s = set__empty(); set__add(&s, 64); set__free(&s); return 0; }
- Expliquer pourquoi le compilateur doit connaître la définition de
struct set
afin de compiler la fonctionmain
ci-dessus. - Écrire un exemple d’utilisation des deux derniers prototypes, et donner leurs avantages et inconvénients.