C

Résolu
darkchristophetd Messages postés 1100 Date d'inscription   Statut Contributeur Dernière intervention   -  
mamiemando Messages postés 33228 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.
Configuration: Windows XP
Firefox 2.0.0.16

3 réponses

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