GNT sans publicité, site mobile, fonctionnalitées exclusives...

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;
}
Lire les 15 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #21553031
In article 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 ?.



Il y a un danger pas trop bien cache: le jour ou tu passes a malloc
pour ton tableau, ca ne marche plus.
PIGUET Bruno
Le #21553231
Le Wed, 14 Apr 2010 08:50:20 +0000, Marc Espie a écrit :

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.
FX
Le #21553491
PIGUET Bruno a écrit :
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 ?.



N'oublie pas de mettre les sizeof entre parenthèses.
PIGUET Bruno
Le #21553941
Le Wed, 14 Apr 2010 12:07:24 +0200, FX a écrit :

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.
Antoine Leca
Le #21553721
FX écrivit :
PIGUET Bruno a écrit :
sur sizeof (tab) / sizeof (*tab) (voir l'ECM en PS).



N'oublie pas de mettre les sizeof entre parenthèses.



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
Publicité
Suivre les réponses
Poster une réponse
Anonyme