C
Résolu
Bonjour,
Je suis en train d'apprendre le C sur le site du zéro et il y a quelque chose que je ne comprends pas :
voici un bout de code qui affiche un tableau :
je ne comprends pas comment dans la boucle for de la fonction affiche, on connait la valeur de tailleTableau alors que on ne l'a pas déclaré....
Merci de m'éclairer sur ce point.
Je suis en train d'apprendre le C sur le site du zéro et il y a quelque chose que je ne comprends pas :
voici un bout de code qui affiche un tableau :
// Prototype de la fonction d'affichage void affiche(long *tableau, long tailleTableau); int main(int argc, char *argv[]) { long tableau[4] = {10, 15, 3}; // On affiche le contenu du tableau affiche(tableau, 4); return 0; } void affiche(long *tableau, long tailleTableau) { long i; for (i = 0 ; i < tailleTableau ; i++) { printf("%ld\n", tableau[i]); } }
je ne comprends pas comment dans la boucle for de la fonction affiche, on connait la valeur de tailleTableau alors que on ne l'a pas déclaré....
Merci de m'éclairer sur ce point.
3 réponses
Elle est passée en paramètre de ta fonction affiche. En effet en C, un tableau est un pointeur (une adresse mémoire) et n'indique à aucun moment la taille dudit tableau.
Exception : Si tu considères une chaîne de caractère (un tableau de char, un char * en somme) on ne sait a priori pas la longueur de ce tableau. Toutefois dans ce cas particulier, le dernier caractère de la chaîne est suivi du caractère spécial '\0'. Ainsi quand tu écris "tapir", tu manipules en réalité 't' 'a' 'p' 'i' 'r' '\0'. C'est comme ça que les fonctions printf ou strlen arrivent à déterminer la longueur de ta chaîne.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/sprintf.3.html
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strlen.3.html
Dans le cas d'un tableau classique il n'y a pas de caractère spécial d'arrêt, il faut donc lui dire quand arrêter d'avancer dans le tableau. C'est le rôle du second paramètre que tu passes à affiche. Si tu dépasses de cette zone, il y a de bonne chance que tu sortes du segment de mémoire associé à ton tableau (segmentation fault).
Ainsi dans ton cas tu pourrais tout à fait écrire :
Est-ce que c'est plus clair ?
Remarque : dans ton cas il est inutile d'écrire le prototype, puis le main, puis affiche. Tu peux écrire directement affiche, puis le main.
Remarque 2 : vu que tu fais appel à printf il faut inclure le header correspondant en mettant au début de ton fichier :
Les headers sont indiqués dans les pages de man comme celles indiquées plus haut. Ils permettent d'utiliser des fonctions standard de la libc. Si tu es sous linux tape simplement dans un terminal :
Si tu es sous windows tu peux t'en sortir en tapant "man printf" sous google. Puisque tu débutes ne perds pas de vue que le man fait partie des outils indispensables pour programmer !
Bonne chance
Exception : Si tu considères une chaîne de caractère (un tableau de char, un char * en somme) on ne sait a priori pas la longueur de ce tableau. Toutefois dans ce cas particulier, le dernier caractère de la chaîne est suivi du caractère spécial '\0'. Ainsi quand tu écris "tapir", tu manipules en réalité 't' 'a' 'p' 'i' 'r' '\0'. C'est comme ça que les fonctions printf ou strlen arrivent à déterminer la longueur de ta chaîne.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/sprintf.3.html
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strlen.3.html
Dans le cas d'un tableau classique il n'y a pas de caractère spécial d'arrêt, il faut donc lui dire quand arrêter d'avancer dans le tableau. C'est le rôle du second paramètre que tu passes à affiche. Si tu dépasses de cette zone, il y a de bonne chance que tu sortes du segment de mémoire associé à ton tableau (segmentation fault).
Ainsi dans ton cas tu pourrais tout à fait écrire :
affiche(tableau, 4); // affiche les 4 premiers nombres du tableau // le 4e n'est pas initialisé (ce sera sans doute un 0) // mais il est alloué à la déclaration de ton tableau affiche(tableau, 2); // affiche les 2 premiers nombres du tableaumais pas :
affiche(tableau, 69); // segmentation fault
Est-ce que c'est plus clair ?
Remarque : dans ton cas il est inutile d'écrire le prototype, puis le main, puis affiche. Tu peux écrire directement affiche, puis le main.
Remarque 2 : vu que tu fais appel à printf il faut inclure le header correspondant en mettant au début de ton fichier :
#include <stdio.h>
Les headers sont indiqués dans les pages de man comme celles indiquées plus haut. Ils permettent d'utiliser des fonctions standard de la libc. Si tu es sous linux tape simplement dans un terminal :
man printf
Si tu es sous windows tu peux t'en sortir en tapant "man printf" sous google. Puisque tu débutes ne perds pas de vue que le man fait partie des outils indispensables pour programmer !
Bonne chance