C

Résolu
darkchristophetd Messages postés 1100 Date d'inscription   Statut Contributeur Dernière intervention   -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
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 :
// 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

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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 :
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 tableau
mais 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
-1
darkchristophetd Messages postés 1100 Date d'inscription   Statut Contributeur Dernière intervention   459
 
merci
-1
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Pas de problème bonne continuation :-)
-1