Problème de tableau en C

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
Bonjour à tous!

J'ai une erreur (probablement stupide) avec ma fonction en C. Mon but est de créer une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau selon la taille de celui-ci (ouf! :p). Ma fonction "main.c" doit afficher le résultat de cette somme. Sans plus tarder, le code:

tableau.c

Bloc de code:
//créer une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau (utilisez un return pour renvoyer la valeur).
//Pour vous aider, voici le prototype de la fonction à créer :


long sommeTableau(long tableau[], long tailleTableau)

{
    long i; // notre compteur
    long somme = 0;

    for(i=0; i < tailleTableau; i++);  // tant que "i" est plus petit que la taille du tableau, on incrémente
    
    {
        long somme = tableau[i] + somme; // à chaque fois, on aditionne la valeur avec le total des précédentes (somme)
    }
    
    return somme; // on renvoie le total
    
}


Et maintenant la fonction main


Bloc de code:
#include <stdio.h>
#include <stdlib.h>
#include "tableau.h"
#include "minute.h"


int main(int argc, char *argv[])
{
    
    long notes [5] = {87,82,94,92,79};
    
    printf("%ld", sommeTableau(notes, 5));

    return 0;
}


Merci beaucoup de m'aider, je n'arrive pas à trouver la solution :(


EDIT: Ne vous affolez pas si je ne répond pas avant quelques heures, décalage horaire québécois oblige ;)
 

Didier Guillion

Membre expert
Club MacG
20 Juillet 2001
3 244
164
59
Toulouse
www.myriad-online.com
Et a mon avis, comme tu declare "somme" deux fois ca va pas le faire...

Bloc de code:
long sommeTableau(long tableau[], long tailleTableau)

{
    long i; // notre compteur
    long somme = 0;

    for(i=0; i < tailleTableau; i++)  // tant que "i" est plus petit que la taille du tableau, on incrémente
    
    {
       somme = tableau[i] + somme; // à chaque fois, on aditionne la valeur avec le total des précédentes (somme)
    }
    
    return(somme); // on renvoie le total
    
}

Cordialement
 
  • J’aime
Réactions: anthoprotic

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
C'est quoi l'erreur ? Il te retourne 0 ? vire le ; entre for() et l'accolade ouvrante. ;)

Oui, c'est exactement ça le problème, mon résultat final est toujours "0" :( Même si j'ai supprimé le ; le résultat est le même...


Et a mon avis, comme tu declare "somme" deux fois ca va pas le faire...

Cordialement

Malheureusement, il m'affiche une erreur «undeclared variable» si je ne le déclare pas au début :(

Voici le code, à peine modifié (le ; en moins), mais toujours pas fonctionnels

Bloc de code:
long sommeTableau(long tableau[], long tailleTableau)

{
    long i; // notre compteur
    long somme = 0;

    for(i=0; i < tailleTableau; i++)  // tant que "i" est plus petit que la taille du tableau, on incrémente
    
    {
        long somme = tableau[i] + somme; // à chaque fois, on aditionne la valeur avec le total des précédentes (somme)
    }
    
    return somme; // on renvoie le total
    
}

Merci encore de m'aider à trouver ce fichu problème! :hein:
 

Céroce

Membre actif
Malheureusement, il m'affiche une erreur «undeclared variable» si je ne le déclare pas au début :(

Bloc de code:
        long somme = tableau[i] + somme;

C'est sur cette ligne-ci qu'il faut supprimer le long. Ici, tu crées une variable somme locale à la boucle for. Elle supplante l'autre déclarée locale à la fonction.
(Et vire le ; après le for, comme indiqué par Didier).
 
  • J’aime
Réactions: anthoprotic

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
HOURRA!!! Merci beaucoup à tous, mon programme fonctionne maintenant! Par contre, ne partez pas si loin, il se peut que j'ai d'autres questions sur les tableaux bientôt ;)

Voici le code final (la solution était d'enlever le long avant le somme, comme suggéré par Céroce.)

Bloc de code:
long sommeTableau(long tableau[], long tailleTableau)

{
    long i; // notre compteur
    long somme = 0;

    for(i=0; i < tailleTableau; i++)  // tant que "i" est plus petit que la taille du tableau, on incrémente
    
    {
        somme = tableau[i] + somme; // à chaque fois, on aditionne la valeur avec le total des précédentes (somme)
    }
    
    return somme; // on renvoie le total
    
}
 

Didier Guillion

Membre expert
Club MacG
20 Juillet 2001
3 244
164
59
Toulouse
www.myriad-online.com
Pour la curiosité intellectuelle, ton code peut se simplifier.

Le premier parametre, un tableau à une dimension (vecteur) est aussi un pointeur.

Bloc de code:
long sommeTableau(long * tableau, long tailleTableau)

{
    long somme = 0;

   while(taille--) somme+=*(tableau++);
    
    return(somme); // on renvoie le total
    
}

Cordialement
 

Didier Guillion

Membre expert
Club MacG
20 Juillet 2001
3 244
164
59
Toulouse
www.myriad-online.com
Oui, mais sauras-tu l'écrire en une ligne, une seule ;-)

Avec une macro, ptet ben. Mais c'est juste pour lui aider a comprendre la notion d'adresse et de pointeur.

En tout cas, malgres ses maladresses, je doit dire qu' anthoprotic a pris la peine de commenter son code et ca c'est plus que bien.

Bonne continuation, tu es dans le bon chemin.

Cordialement
 

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
Milles excuses, je n'avais pas compris quand didier m'avait parlé de double déclaration de variable, j'avais mal interprété :)

De plus, je ne comprend pas le rôle de while-- dans la boucle (il n'y a pas de condition), vous pouvez expliquer?

Bloc de code:
long sommeTableau(long * tableau, long tailleTableau)

{
    long somme = 0;

   while(taille--) somme+=*(tableau++); // que fait cette ligne?
    
    return(somme); // on renvoie le total
    
}
Je vous remercie pour tous vos encouragements et votre aide :)
 

grumff

Membre expert
Club MacG
9 Novembre 2000
3 606
99
Grenoble, France
www.grumff.com
Taille est un entier, donc tant qu'il est différent de 0, c'est une condition à "true", dès qu'il passe à 0, il est à "false". Le "--" le décrémente à chaque tour de boucle, mais après l'avoir évalué.

Après il faut toujours relativiser ce genre d'optim, le compilateur fera aussi bien tout seul, tandis qu'on perd en lisibilité. La programmation n'est pas un concours dont le but serait d'écrire le moins de lignes possible.
 

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
Merci pour l'explication, mais je crois m'en rester avec l'autre méthode, qui est plus compréhensible pour moi (après tout, chacun sa méthode!) :)
 

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
Bonsoir,

malheureusement, un autre problème :( Cette fois, je n'ai pas fait les mêmes erreurs que la dernière fois (j'ai vérifié :p)

voici le code:

main.c

Bloc de code:
int main(int argc, char *argv[])
{
    
 
    double moyenne[3] = {40,20,35};
    
    
    printf("La moyenne est %ld\n\n", moyenneTableau(moyenne, 3));

// l'erreur est ici : Warning: passing argument 1 of 'moyenneTableau' from incompatible pointer type
           

    return 0;
}

et la fonction qui doit faire la moyenne des entrées.

tableau.c

Bloc de code:
// créer une fonction moyenneTableau qui calcule et renvoie la moyenne des valeurs.


double moyenneTableau(long tableau[], long tailleTableau)

{
    
    long i; // notre compteur
    double moyenne = 0;
    
    for(i = 0; i<tailleTableau; i++) // tant que "i" est plus petit que la taille du tableau, on incrémente
        
    {
        moyenne = (tableau[i] + moyenne)/tailleTableau; //on fait un lien vers chaque valeurs du tableau, pour les aditionner et les diviser par le nombre d'éléments 
    }
    
    return moyenne; // on renvoie la moyenne
    
}

Malheureusement, je ne trouve pas mon erreur... le résultat est toujours "0" :(

N.B: J'ai aussi un "Warning: passing argument 1 of 'moyenneTableau' from incompatible pointer type" dans mon main, tout de suite après le "printf"
 

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
Non non, t'inquiète c'est des tutos que je suis dans mes temps libre sur internet ;)

Et excuse-moi, mais je ne comprend pas ta réponde (ainsi que la vérification des paramètres) :confused:
 

anthoprotic

Membre expert
Club MacG
10 Avril 2007
1 754
84
Québec, Canada
Merci mais il m'affiche seulement 31.0000, pas de decimaux (alorsbque ça devrait être 31,666667)!


Bonjour à tous!

J'ai une erreur (probablement stupide) avec ma fonction en C. Mon but est de créer une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau selon la taille de celui-ci (ouf! :p). Ma fonction "main.c" doit afficher le résultat de cette somme. Sans plus tarder, le code:

tableau.c

Bloc de code:
//créer une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau (utilisez un return pour renvoyer la valeur).
//Pour vous aider, voici le prototype de la fonction à créer :


long sommeTableau(long tableau[], long tailleTableau)

{
    long i; // notre compteur
    long somme = 0;

    for(i=0; i < tailleTableau; i++);  // tant que "i" est plus petit que la taille du tableau, on incrémente
    
    {
        long somme = tableau[i] + somme; // à chaque fois, on aditionne la valeur avec le total des précédentes (somme)
    }
    
    return somme; // on renvoie le total
    
}


Et maintenant la fonction main


Bloc de code:
#include <stdio.h>
#include <stdlib.h>
#include "tableau.h"
#include "minute.h"


int main(int argc, char *argv[])
{
    
    long notes [5] = {87,82,94,92,79};
    
    printf("%ld", sommeTableau(notes, 5));

    return 0;
}


Merci beaucoup de m'aider, je n'arrive pas à trouver la solution :(


EDIT: Ne vous affolez pas si je ne répond pas avant quelques heures, décalage horaire québécois oblige ;)
 

Didier Guillion

Membre expert
Club MacG
20 Juillet 2001
3 244
164
59
Toulouse
www.myriad-online.com
Regarde bien : la fonction attends en premier parametre un tableau de long et tu envoie un tableau de double. Tu dois avoir d'ailleurs un warning du compilateur.

Ta fonction doit etre déclarée :
double sommeTableau(double * tableau, long tailleTableau)


En plus tu ecrit :
moyenne = (tableau + moyenne)/tailleTableau;

Ce qui ne fait pas ce que tu veut.

C'est plutot :
for(i = 0; i<tailleTableau; i++)

{
moyenne = moyenne+tableau;
}

moyenne=moyenne/tailleTableau;


Cordialement