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\n", i, villes[i]);
}
return 0;
}
La valeur terminale dépendra des données, par exemple -1 pour un tableau de nbr positifs, NULL, "", ou tout autre valeur qu'on puisse différentier des valeurs potentiellement utilisees.
Oui, l'usage d'une sentinelle pour indiquer la fin de tableau est un truc assez pratique, surtout si on joue avec des pointeurs à la place des tableaux. C'est simple, propre efficace.
Tiens, je me demande si le fait qu'on ait argv[argc] == NULL dans main() ne tiendrait pas de cette idée de sentinelle (mais je sais pas si c'est général ou juste le fait que execve() impose cette convention).
sam.
zwim a écrit :
La valeur terminale dépendra des données, par exemple -1 pour un
tableau de nbr positifs, NULL, "", ou tout autre valeur qu'on puisse
différentier des valeurs potentiellement utilisees.
Oui, l'usage d'une sentinelle pour indiquer la fin de tableau est un
truc assez pratique, surtout si on joue avec des pointeurs à la place
des tableaux. C'est simple, propre efficace.
Tiens, je me demande si le fait qu'on ait argv[argc] == NULL dans main()
ne tiendrait pas de cette idée de sentinelle (mais je sais pas si
c'est général ou juste le fait que execve() impose cette convention).
La valeur terminale dépendra des données, par exemple -1 pour un tableau de nbr positifs, NULL, "", ou tout autre valeur qu'on puisse différentier des valeurs potentiellement utilisees.
Oui, l'usage d'une sentinelle pour indiquer la fin de tableau est un truc assez pratique, surtout si on joue avec des pointeurs à la place des tableaux. C'est simple, propre efficace.
Tiens, je me demande si le fait qu'on ait argv[argc] == NULL dans main() ne tiendrait pas de cette idée de sentinelle (mais je sais pas si c'est général ou juste le fait que execve() impose cette convention).
sam.
Jean-Marc Bourguet
Samuel DEVULDER writes:
Tiens, je me demande si le fait qu'on ait argv[argc] == NULL dans main() ne tiendrait pas de cette idée de sentinelle (mais je sais pas si c'est général
C'est demande par C90.
A+
-- Jean-Marc FAQ de fclc: http://www.levenez.com/lang/c/faq Site de usenet-fr: http://www.usenet-fr.news.eu.org
Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> writes:
Tiens, je me demande si le fait qu'on ait argv[argc] == NULL dans main() ne
tiendrait pas de cette idée de sentinelle (mais je sais pas si c'est
général
C'est demande par C90.
A+
--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Tiens, je me demande si le fait qu'on ait argv[argc] == NULL dans main() ne tiendrait pas de cette idée de sentinelle (mais je sais pas si c'est général
C'est demande par C90.
A+
-- Jean-Marc FAQ de fclc: http://www.levenez.com/lang/c/faq Site de usenet-fr: http://www.usenet-fr.news.eu.org
Jean-Christophe
On Apr 14, 9:40 am, PIGUET Bruno
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)
Dans ces cas j'utilise parfois un terminateur (0 ou NULL) dans la liste des pointeurs pour détecter la fin de la liste.
#include<stdio.h> int main(void) { char *villes[] = { "Paris", "Lyon", "Toulouse", 0 }; int i; for( i=0; villes[i]; i++ ) printf ("%d : %sn", i, villes[i]); return 0; }
On Apr 14, 9:40 am, PIGUET Bruno
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)
Dans ces cas j'utilise parfois un terminateur (0 ou NULL)
dans la liste des pointeurs pour détecter la fin de la liste.
#include<stdio.h>
int main(void)
{
char *villes[] = { "Paris", "Lyon", "Toulouse", 0 };
int i;
for( i=0; villes[i]; i++ )
printf ("%d : %sn", 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)
Dans ces cas j'utilise parfois un terminateur (0 ou NULL) dans la liste des pointeurs pour détecter la fin de la liste.
#include<stdio.h> int main(void) { char *villes[] = { "Paris", "Lyon", "Toulouse", 0 }; int i; for( i=0; villes[i]; i++ ) printf ("%d : %sn", i, villes[i]); return 0; }
zwim
Le Mon, 19 Apr 2010 05:29:56 -0700 (PDT) Jean-Christophe a écrit
On Apr 14, 9:40 am, PIGUET Bruno
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)
Dans ces cas j'utilise parfois un terminateur (0 ou NULL) dans la liste des pointeurs pour détecter la fin de la liste.
#include<stdio.h> int main(void) { char *villes[] = { "Paris", "Lyon", "Toulouse", 0 }; int i; for( i=0; villes[i]; i++ ) printf ("%d : %sn", i, villes[i]); return 0; }
C'est-y pas ce que j'ai écrit ?!
-- zwim. Rien n'est impossible que la mesure de la volonté humaine...
Le Mon, 19 Apr 2010 05:29:56 -0700 (PDT)
Jean-Christophe a écrit
On Apr 14, 9:40 am, PIGUET Bruno
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)
Dans ces cas j'utilise parfois un terminateur (0 ou NULL)
dans la liste des pointeurs pour détecter la fin de la liste.
#include<stdio.h>
int main(void)
{
char *villes[] = { "Paris", "Lyon", "Toulouse", 0 };
int i;
for( i=0; villes[i]; i++ )
printf ("%d : %sn", i, villes[i]);
return 0;
}
C'est-y pas ce que j'ai écrit ?!
--
zwim.
Rien n'est impossible que la mesure de la volonté humaine...
Le Mon, 19 Apr 2010 05:29:56 -0700 (PDT) Jean-Christophe a écrit
On Apr 14, 9:40 am, PIGUET Bruno
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)
Dans ces cas j'utilise parfois un terminateur (0 ou NULL) dans la liste des pointeurs pour détecter la fin de la liste.
#include<stdio.h> int main(void) { char *villes[] = { "Paris", "Lyon", "Toulouse", 0 }; int i; for( i=0; villes[i]; i++ ) printf ("%d : %sn", i, villes[i]); return 0; }
C'est-y pas ce que j'ai écrit ?!
-- zwim. Rien n'est impossible que la mesure de la volonté humaine...
Jean-Christophe
On Apr 20, 9:33 pm, zwim
C'est-y pas ce que j'ai écrit ?!
Si, c'est-y, j'avions pas vu ton post-it, désolé !
On Apr 20, 9:33 pm, zwim
C'est-y pas ce que j'ai écrit ?!
Si, c'est-y, j'avions pas vu ton post-it, désolé !