diff --git a/tris_multiples.md b/tris_multiples.md index b67ac3c8636513ec8a94a68b86aa1b0eeb8d0137..bdccbcb6df0afbd7f7812153f3ec5ecf9ba69e77 100644 --- a/tris_multiples.md +++ b/tris_multiples.md @@ -70,8 +70,6 @@ n >> k == 0011 // 3 en décimal Certains tris à implémenter, vous devez échanger les pointeurs vers des tableaux statiques. -Comme plusieurs d'entre-vous l'ont découvert à leur dépens cette étape n'est pas triviale. - En effet, on pourrait se dire que le code suivant ```C @@ -81,10 +79,19 @@ swap(&a, &b); // ici en fait a est toujours le tableau 1, 2, 3, 4 // et b est toujours 5, 6, 7, 8 ``` + ferait pointer le tableau `a` sur les données de `b` et vice-versa. Hors ce n'est absolument pas le cas car les tableaux statiques **ne sont pas que des pointeurs**. Quand on passe un tableau statique en argument à une fonction, il est effectivement transformé pointeur. Mais cela ne suffit pas. +L'impossibilité de faire un échange de tableaux statique est dûe à l'impossibilité en `C` d'assigner un tableau +statique à un autre tableau statique. Ainsi, +```C +int a[3] = {1, 2, 3}; +int b[3] = a; +``` +n'est pas une syntaxe valide et c'est ce qu'on essaie de faire dans le code précédent. + Pour pouvoir effectuer le travail qui vous est demandé, il faut soit faire de l'allocation dynamique (ce qu'on a pas encore fait en cours) ou alors tricher un peu. En fait, pour réussir à faire un échange de pointeurs de mémoire, il faut définir deux nouvelles variables, qui sont des vrais pointeurs (elles). @@ -94,7 +101,7 @@ int a[] = {1, 2, 3, 4}; int b[] = {5, 6, 7, 8}; int *c = a; int *d = b; -swap(&c, &d); +swap_ptr(&c, &d); // ici en fait a est toujours le tableau 1, 2, 3, 4 // et b est toujours 5, 6, 7, 8 // mais c pointe sur 5, 6, 7, 8 @@ -102,6 +109,7 @@ swap(&c, &d); ``` on a l'effet voulu. On échange effectivement les pointeurs vers les données voulues. + ### La copie du tableau final Quand on échange les pointeurs vers des tableaux statiques dans la fonction de tri, un problème peut survenir.