/* * Diverses constructions d'un tableau de tubes * * Edouard.Thiel@lif.univ-mrs.fr - 2/10/2013 * * This program is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ /* Usage : recopier dans la console : for ((i = 1; i <= 7; i++)); do gcc -Wall -W -std=c99 tab-tubes.c -o tab-tubes -DMETHODE_$i && ./tab-tubes done */ #include #include #include #include #ifdef METHODE_1 #define TUBMAX 10 void ouvrir_tubes (int tubes[][2], int ntubes) { for (int i = 0; i < ntubes; i++) if (pipe(tubes[i]) < 0) { perror ("pipe"); exit (1); } } void fermer_tubes (int tubes[][2], int ntubes) { for (int i = 0; i < ntubes; i++) { close (tubes[i][0]); close (tubes[i][1]); } } int main () { int tubes[TUBMAX][2], ntubes = 5; printf ("Méthode 1 : tableau de taille constante\n"); assert (ntubes <= TUBMAX); ouvrir_tubes (tubes, ntubes); fermer_tubes (tubes, ntubes); printf ("succès\n"); exit (0); } #elif defined METHODE_2 void ouvrir_tubes (int tubes[][2], int ntubes) { for (int i = 0; i < ntubes; i++) if (pipe(tubes[i]) < 0) { perror ("pipe"); exit (1); } } void fermer_tubes (int tubes[][2], int ntubes) { for (int i = 0; i < ntubes; i++) { close (tubes[i][0]); close (tubes[i][1]); } } int main () { /* La déclaration de tableaux de taille variable est autorisée en C99, voir : http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html */ int ntubes = 5, tubes[ntubes][2]; printf ("Méthode 2 : tableau de taille donnée\n"); ouvrir_tubes (tubes, ntubes); fermer_tubes (tubes, ntubes); printf ("succès\n"); exit (0); } #elif defined METHODE_3 typedef int Tube[2]; void ouvrir_tubes (Tube *tubes, int ntubes) { for (int i = 0; i < ntubes; i++) if (pipe(tubes[i]) < 0) { perror ("pipe"); exit (1); } } void fermer_tubes (Tube *tubes, int ntubes) { for (int i = 0; i < ntubes; i++) { close (tubes[i][0]); close (tubes[i][1]); } } int main () { Tube *tubes; int ntubes = 5; printf ("Méthode 3 : tableau dynamique avec un typedef\n"); tubes = malloc (ntubes * sizeof *tubes); if (tubes == NULL) { perror ("malloc"); exit (1); } ouvrir_tubes (tubes, ntubes); fermer_tubes (tubes, ntubes); free (tubes); printf ("succès\n"); exit (0); } #elif defined METHODE_4 void ouvrir_tubes (int tubes[][2], int ntubes) { for (int i = 0; i < ntubes; i++) if (pipe(tubes[i]) < 0) { perror ("pipe"); exit (1); } } void fermer_tubes (int tubes[][2], int ntubes) { for (int i = 0; i < ntubes; i++) { close (tubes[i][0]); close (tubes[i][1]); } } int main () { int (*tubes)[2], ntubes = 5; printf ("Méthode 4 : tableau dynamique de dimension 2\n"); tubes = malloc (ntubes * sizeof *tubes); if (tubes == NULL) { perror ("malloc"); exit (1); } ouvrir_tubes (tubes, ntubes); fermer_tubes (tubes, ntubes); free (tubes); printf ("succès\n"); exit (0); } #elif defined METHODE_5 void ouvrir_tubes (int **tubes, int ntubes) { for (int i = 0; i < ntubes; i++) if (pipe(tubes[i]) < 0) { perror ("pipe"); exit (1); } } void fermer_tubes (int **tubes, int ntubes) { for (int i = 0; i < ntubes; i++) { close (tubes[i][0]); close (tubes[i][1]); } } int main () { int **tubes, ntubes = 5; printf ("Méthode 5 : tableau de tableaux dynamiques\n"); tubes = malloc (ntubes * sizeof *tubes); if (tubes == NULL) { perror ("malloc"); exit (1); } for (int i = 0; i < ntubes; i++) { tubes[i] = malloc (2 * sizeof **tubes); if (tubes[i] == NULL) { perror ("malloc"); exit (1); } } ouvrir_tubes (tubes, ntubes); fermer_tubes (tubes, ntubes); for (int i = 0; i < ntubes; i++) free (tubes[i]); free (tubes); printf ("succès\n"); exit (0); } #elif defined METHODE_6 void ouvrir_tubes (int *tubes, int ntubes) { for (int i = 0; i < ntubes; i++) if (pipe(&tubes[i*2]) < 0) { perror ("pipe"); exit (1); } } void fermer_tubes (int *tubes, int ntubes) { for (int i = 0; i < ntubes; i++) { close (tubes[i*2+0]); close (tubes[i*2+1]); } } int main () { int *tubes, ntubes = 5; printf ("Méthode 6 : tableau dynamique à plat\n"); tubes = malloc (ntubes*2 * sizeof *tubes); if (tubes == NULL) { perror ("malloc"); exit (1); } ouvrir_tubes (tubes, ntubes); fermer_tubes (tubes, ntubes); free (tubes); printf ("succès\n"); exit (0); } #elif defined METHODE_7 typedef struct { int fds[2]; } Tubes; void ouvrir_tubes (Tubes *tubes, int ntubes) { for (int i = 0; i < ntubes; i++) if (pipe(tubes[i].fds) < 0) { perror ("pipe"); exit (1); } } void fermer_tubes (Tubes *tubes, int ntubes) { for (int i = 0; i < ntubes; i++) { close (tubes[i].fds[0]); close (tubes[i].fds[1]); } } int main () { Tubes *tubes; int ntubes = 5; printf ("Méthode 7 : tableau dynamique de structs\n"); tubes = malloc (ntubes * sizeof *tubes); if (tubes == NULL) { perror ("malloc"); exit (1); } ouvrir_tubes (tubes, ntubes); fermer_tubes (tubes, ntubes); free (tubes); printf ("succès\n"); exit (0); } #endif /* METHODE_x */