tableau souple
Le
PIGUET Bruno
Bonjour,
Pour créer, puis parcourir, un tableau constant (au sens du langage C),
mais pouvant évoluer (au fil des différentes versions), sans m'embêter
avec des #define NB_VAL ou autre, j'utilise un idiome basé sur sizeof
(tab) / sizeof (*tab) (voir l'ECM en PS).
Les avisés lecteurs de ce newsgroup ont-il un avis sur cette
technique ? Y-a-t'il un danger caché ? Avez-vous autre chose à
recommander ?.
Merci d'avance,
Bruno.
PS : voici l'ECM :
#include<stdio.h>
int
main ()
{
char *villes[] = { "Paris", "Lyon", "Toulouse" };
int i;
for (i = 0; i < sizeof (villes) / sizeof (*villes); i++)
{
printf ("%d : %s", i, villes[i]);
}
return 0;
}
Pour créer, puis parcourir, un tableau constant (au sens du langage C),
mais pouvant évoluer (au fil des différentes versions), sans m'embêter
avec des #define NB_VAL ou autre, j'utilise un idiome basé sur sizeof
(tab) / sizeof (*tab) (voir l'ECM en PS).
Les avisés lecteurs de ce newsgroup ont-il un avis sur cette
technique ? Y-a-t'il un danger caché ? Avez-vous autre chose à
recommander ?.
Merci d'avance,
Bruno.
PS : voici l'ECM :
#include<stdio.h>
int
main ()
{
char *villes[] = { "Paris", "Lyon", "Toulouse" };
int i;
for (i = 0; i < sizeof (villes) / sizeof (*villes); i++)
{
printf ("%d : %s", i, villes[i]);
}
return 0;
}

Poser une question


Il y a un danger pas trop bien cache: le jour ou tu passes a malloc
pour ton tableau, ca ne marche plus.
Je n'envisage pas de passer à malloc() dans ce cas : c'est vraiment
pour un tableau constant codé en dur dans le code, mais dont le nombre
d'éléments peut changer d'une version à l'autre.
Ce n'est pas pour une fonction de bibliothèque, qui ne pourrait
effectivement pas faire d'hypothèse sur l'origine du tableau.
Bruno.
N'oublie pas de mettre les sizeof entre parenthèses.
Ah, tiens ?
Pourquoi ?
En général, j'entoure de parenthèse les macros qui risquent de produire
quelque chose comme : a-b. Avec les parenthèses, le compilateur comprend
bien : (a1-b1)/(a2-b2) et pas : a1 - b1/a2 -b2.
Mais sizeof() n'est pas un macro, que je sache ?
Bruno.
Peut-on avoir plus de détails sur la position des parenthèses
supplémentaires que tu proposes et la raison de ta recommandation ?
Surtout que même si je comprend tout-à-fait la position de Bruno de
mettre des parenthèses en réalité inutiles mais qui évitent de se poser
des questions, j'ai l'habitude d'écrire le contraire :
sizeof tab / sizeof*tab
Et je ne vois pas de raison de mettre un appel de fonction ou un
indiçage (genre 2[villes]) derrière une expression comme celle-ci.
Antoine