Examen 2018 question 1.7

Examen 2018 question 1.7

by Shayan Khajehnouri -
Number of replies: 2

Le tableau pris en argument de la fonction compact peut il être du type (int* tab[]) ? 


In reply to Shayan Khajehnouri

Re: Examen 2018 question 1.7

by Tom Louis Demont -

Je dirais que non parce que le pointeur ne pourrait alors pas connaitre la taille à allouer pour stocker un des éléments qu'il pointe. De la même façon qu'on ne peut définir un tab[][], il faut définir un tab[][SIZE] pour que le pointeur sache quelle étendue de mémoire il doit allouer pour ses élements.

int** solve ce problème car il permet de définir qu'un élément pointé à la taille (taille d'un pointeur/d'une adresse) : on perd la continuité en mémoire offerte par le tableau mais on gagne la connaissance d'une taille fixe de l'élément pointé.

In reply to Tom Louis Demont

Re: Examen 2018 question 1.7

by Jean-Cédric Chappelier -

Il y a un peu de confusion ici :
tout d'abord, la taille est connue puisque passée en second argument (ou alors si vous parlez du 2e niveau : elle est connue car on sait que ce sont des int : sizeof(int)).
Deuxièmement, il ne faut en effet pas confondre le cas le plus général int** et le cas particulier du passage à une fonction d'un tableau d'int à deux dimensions  : int[M][N]. Mais attention ici on ne parlait pas d'un tableau d'int à 2 dimensions, mais bien d'un tableau de pointeurs sur des int.

J'essaye d'être plus clair (voir aussi le dessin en fin de message)  :
il faut se rappeler que passer un tableau à une fonction se fait TOUJOURS comme un pointeur : quelque soit le type X (et Y, mais il n'importe pas ici), la fonction

Y f(X tab[N]);

est TOUJOURS exactement comme
Y f(X* tab);

[et c'est pour cela qu'il faut toujours avoir la taille du tableau comme paramètre supplémentaire]
donc la réponse à la question initialement posée est : oui :
int* compact(int* tab[], size_t taille);

est EXACTEMENT la même chose que
int* compact(int** tab, size_t taille);

[Note : attention à ne pas oublier d'avoir la taille comme 2e paramètre).

Voici [cf image ci-dessous] l'illustration pour le code C suivant pour un type X quelconque :

void f(X a[]);
...
X t[N] = { .... };
f(t);

Si vous appliquez ça à X étant « int* » vous voyez bien que vous avez le cas dessiné en bas à droite.


J'espère avoir pu clarifier.