1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 11
    Points : 7
    Points
    7

    Par défaut Affichage de tableau incompréhensible

    Bonjour,

    quelqu'un peut-il m'éclairer?
    J'ai écrit un code pour apprivoiser les tableaux. Je n'ai pas terminé toutes les alternatives, mais lorsque je choisis d'appliquer ma seule fonction alors proposée ("Afficher éléments des tableaux") soit le choix n°1 appelant ma fonction
    int display(int tab1[],int tab2[])
    , et que je rentre par exemple les valeurs tab1[i]={1,2,3,4} et tab2[i]={5,6,7,8} eh bien la console affiche cela (voir ci-dessous). En somme la première valeur de Tab1 prend la dernière de tab2 et surtout il manque une ligne au tableau 2. Je mets mon code plus bas. Si quelqu'un peut m'expliquer... J'ai pourtant bien réfléchi à ma boucle for, mais je ne comprends pas...

    TABLEAU 1: Votre valeur numero 0 est: 8
    TABLEAU 1: Votre valeur numero 1 est: 2
    TABLEAU 1: Votre valeur numero 2 est: 3
    TABLEAU 1: Votre valeur numero 3 est: 4
    TABLEAU 2: Votre valeur numero 0 est: 5
    TABLEAU 2: Votre valeur numero 1 est: 6
    TABLEAU 2: Votre valeur numero 2 est: 7

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(int argc, char *argv[])
    {
        int tab1[3], tab2[3];
        int i=0, choix=0;
     
        //SAISIE DES VALEURS
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        printf("=======SAISIE DES VALEURS DU TABLEAU NUMERO 1========\n");
            for(i=0;i<=3;i++)
            {
                 printf("Veuillez rentrer la valeur %d : ",i);
                 scanf("%d",&tab1[i]);
                 printf("\n");
            }
        printf("=======SAISIE DES VALEURS DU TABLEAU NUMERO 2========\n");
           for(i=0;i<=3;i++)
            {
                 printf("Veuillez rentrer la valeur %d : ",i);
                 scanf("%d",&tab2[i]);
                printf("\n");
            }
     
        //UTILISATION DES FONCTIONS SOUHAITEE
        printf("=======VEUILLEZ CHOISIR UNE APPLICATION=========\n");
        printf("1-AFFICHER ELEMENTS DES TABLEAUX\n");
        printf("2-SOMME ELEMENTS TABLEAU 1\n");
        printf("3-MOYENNE ELEMENTS TABLEAU 1\n");
        printf("4-COPIER TABLEAU 1 DANS TABLEAU 2\n");
        printf("5-MAXIMUM TABLEAU 1\n");
        printf("6-ORDONNER TABLEAU 1\n");
        printf("                VOTRE CHOIX: ");
        scanf("%d",&choix);
     
        switch(choix)
        {
            case 1:
            display(tab1,tab2);
            break;
            case 2:
            printf("Simple test fonction 1\n");
             display(tab1,tab2);
            break;
            case 3:
            printf("En cours\n");
            break;
            case 4:
            printf("En cours\n");
            break;
            case 5:
            printf("En cours\n");
            break;
            case 6:
            printf("En cours\n");
            break;
            default:
            printf("Nous n'avons pas compris votre demande");
            break;
        }
    return 0;
        }
     
     
     
    int display(int tab1[],int tab2[])
    {
        int i=0;
        for(i=0;i<=3;i++)
        {
            printf("\n\nTABLEAU 1: Votre valeur numero %d est: %d",i,tab1[i]);
        }
     
     
         for(i=0;i<=3;i++)
        {
            printf("\n\n        TABLEAU 2: Votre valeur numero %d est: %d",i,tab2[i]);
        }
     
    return 0;
    }

  2. #2
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 249
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 249
    Points : 3 612
    Points
    3 612

    Par défaut

    Tu déclares tes tableaux comme contenant trois éléments. Tu les adresses en partant du postulat qu'ils en contiennent quatre. Cela entraîne un comportement indéterminé et il n'est pas possible de déduire quoi que ce soit des résultats du programme.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 699
    Points : 39 047
    Points
    39 047

    Par défaut

    Si tes tableaux ont trois éléments, les indexes doivent aller de 0 à 2, et non pas de 0 à 3.
    Donc, tu dois remplacer tes for(i=0 ; i<=3 ; i++) par for(i=0 ; i<3 ; i++).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 11
    Points : 7
    Points
    7

    Par défaut

    Merci Medinoc et Matt-Houston.
    Je n'avait pas pensé à la question des indices.
    Ca marche de nouveau, mais je ne comprends pas.
    Dns mon cours sur openclassroon.com, le prof indique ceci:

    Attention : un tableau commence à l'indice n° 0 ! Notre tableau de 4 int a donc les indices 0, 1, 2 et 3. Il n'y a pas d'indice 4 dans un tableau de 4 cases ! C'est une source d'erreurs très courantes, souvenez-vous-en.

    Comment se fait-ce alors que je ne puisse pas déclarer mes quatre éléments dans un tableau tab1[3] qui devrait comporter 4 emplacements???
    On apprend en tout cas de ses erreurs.
    Merci encore

  5. #5
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 249
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 249
    Points : 3 612
    Points
    3 612

    Par défaut

    Oui l'adressage se fait bien à partir de zéro, jusqu'à N - 1 inclus (N étant le nombre d'éléments) mais il te faut distinguer :

    • la déclaration du tableau : int foo[4]; // le tableau 'foo' contient 4 objets de type 'int',
      cela remplace la déclaration d'autant de variables du même type : int foo0, foo1, foo2, foo3;;
    • l'adressage des éléments du tableau :
      foo[0] = 0; // on accède au premier élément du tableau, situé à partir de l'adresse de 'foo' + 0 * sizeof(int) octetsprintf("%d ", foo[3]); // on accède au quatrième et dernier élément du tableau, situé à pertir de l'adresse de 'foo' + 3 * sizeof(int) octets.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 11
    Points : 7
    Points
    7

    Par défaut

    Super, très clair.
    j'ai compris.
    Merci beaucoup.

  7. #7
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    mars 2009
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : mars 2009
    Messages : 492
    Points : 322
    Points
    322
    Billets dans le blog
    3

    Par défaut

    Si tu vas chez l'épicier et que tu lui demande :
    " Je voudrais trois œufs ...." ,il va t'en donner 3 ,pas 4 ni 2 ;
    Par contre tu peux marquer sur la coquille de chaque œuf un numéro
    en commençant par 0 puis 1 et 2 ; ou bien 1 ,2 et 3.
    Il se trouve que en C la première façon est la règle !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. std ::vector [erreur que je ne comprend pas]
    Par aaronw dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/03/2006, 21h00
  2. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  3. [PostGreSQL] une erreur que je ne comprends pas
    Par flo78 dans le forum PHP & SGBD
    Réponses: 3
    Dernier message: 02/02/2006, 10h18
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo