IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fonction somme tableau


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 137
    Points : 92
    Points
    92
    Par défaut Fonction somme tableau
    Bonjour à tous / toutes,

    je pense qu'il doit s'agir d'une erreur triviale, mais je ne comprend pas pourquoi ma fonction ne marche pas. Le resultat de la variable somme devrait être de 28 or il m'affiche 892.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int sommeTableau(int *snc[], int arraySize);
     
    int main(int argc, char *argv[])
    {
        int tableau[4] = {10, 15, 3};
     
        int total =0;
        total = sommeTableau(tableau, 4);
     
        printf("%d", total);
        return 0;
    }
     
    int sommeTableau(int *snc[], int arraySize)
    {
        int i;
        int somme = 0;
        for(i = 0; i < arraySize;i++)
        {
            somme = somme + snc[i];
            printf("%d - %d \n", somme, snc[i]);
        }
        return somme;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    10 - 10
    55 - 15
    223 - 3
    892 - 0
    892
    Process returned 0 (0x0)   execution time : 0.004 s
    Press any key to continue.
    En remerciant par avance ceux qui prendront le temps de répondre.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Je pense que le mieux serait que tu trouves ton erreur toi-même (c'est comme ça qu'on progresse ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tableau[4] = {10, 15, 3};
    total = sommeTableau(tableau, 4);
    int sommeTableau(int *snc[], int arraySize);
    Rien ne te choque ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    Outre la remarque de Neckara regardes de ce côté http://c.developpez.com/faq/?page=Les-tableaux

    Tu verras que ton passage de paramètres est un peu limite

    Cordialement

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    D'ailleurs, ton compilateur est probablement mal configuré, car tu aurais dû avoir un warning à ce sujet.
    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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 137
    Points : 92
    Points
    92
    Par défaut merci
    j'utilise codeblock.

    Après analyse je crois avoir compris le problème se situait au niveau des * (des pointeurs qui étaient tout faux).

    merci à vous.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Je ne suis pas sûr que tu ais réellement compris ce qui se passait.

    Tu passais un tableau de int à une fonction qui attendait un tableau de int *.
    Ton tableau de int était alors convertit en un tableau de int * (d'ailleurs tel quel je suis surpris que le compilateur accepte de compiller, je connaissais les conversions implicites Type* vers void * et void * vers Type * mais pas TypeA * vers TypeB *).
    N.B. Pour être plus précis, en un int ** car les tableaux ne peuvent pas être passé en paramètre d'une fonction et sont implicitement convertis en pointeurs.

    main.c: In function ‘main’:
    main.c:12:26: warning: passing argument 1 of ‘sommeTableau’ from incompatible pointer type
    total = sommeTableau(tableau, 4);
    ^
    main.c:5:5: note: expected ‘int **’ but argument is of type ‘int *’
    int sommeTableau(int *snc[], int arraySize);
    ^
    main.c: In function ‘sommeTableau’:
    main.c:24:15: warning: assignment makes integer from pointer without a cast
    somme = somme + snc[i];
    Donc dans ta fonction, tu te retrouvais avec un tableau {10,15,3,0} mais non plus de int mais de int *.
    Dès lors, quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme = somme + tab[i];
    Tu ne fait pas int = int + int mais int = int + int*.
    Et c'est là qu'entre en jeu la magie des pointeurs !

    int a + int* b donne un pointeur sur le a ième élément en partant du pointeur b.
    D'ailleurs, *(i + tab) est équivalent à tab[i].

    Donc pour prendre le premier exemple : 10 + 15 = 55.
    On prend l'adresse du 10ème élément en partant du pointeur pointant à l'adresse 15 : (15 + 10*sizeof(int)).
    Ce qui nous donne 15 + 10*4 = 55 (sur ton architecture sizeof(int) = 4).

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/11/2008, 12h02
  2. [VB][Debutant] remplir un tableau fonction somme
    Par maniolo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 04/04/2006, 18h20
  3. Somme Tableau Formulaire
    Par etiennegaloup dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 01/11/2005, 11h56
  4. PB fonction et Tableau
    Par T-B dans le forum Langage
    Réponses: 5
    Dernier message: 23/10/2005, 15h03

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