# Problème de tableau en C



## anthoprotic (12 Janvier 2009)

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! ). Ma fonction "main.c" doit afficher le résultat de cette somme. Sans plus tarder, le code:

*tableau.c*


```
//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*



```
#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


----------



## grumff (12 Janvier 2009)

C'est quoi l'erreur ? Il te retourne 0 ? vire le ; entre for() et l'accolade ouvrante.


----------



## Didier Guillion (12 Janvier 2009)

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


```
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


----------



## anthoprotic (12 Janvier 2009)

grumff a dit:


> 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...




Didier Guillion a dit:


> 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


```
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 (12 Janvier 2009)

anthoprotic a dit:


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



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).


----------



## anthoprotic (12 Janvier 2009)

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.)


```
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
    
}
```


----------



## Céroce (12 Janvier 2009)

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


En fait Didier avait déjà répondu à tout


----------



## Didier Guillion (12 Janvier 2009)

Pour la curiosité intellectuelle, ton code peut se simplifier.

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


```
long sommeTableau(long * tableau, long tailleTableau)

{
    long somme = 0;

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

Cordialement


----------



## Céroce (12 Janvier 2009)

Oui, mais sauras-tu l'écrire en une ligne, une seule ;-)


----------



## Didier Guillion (12 Janvier 2009)

Céroce a dit:


> 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 (12 Janvier 2009)

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?


```
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 (13 Janvier 2009)

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 (13 Janvier 2009)

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 (13 Janvier 2009)

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é )

voici le code:

*main.c*


```
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


```
// 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"


----------



## Didier Guillion (13 Janvier 2009)

La sortie est un double et tu affiche un long (%ld) 
Heureusement que tu as activé la verification des parametres de printf.

Cordialement

PS: J'espere que tu ne nous fait pas écrire un exercice donné par un des tes profs...


----------



## anthoprotic (13 Janvier 2009)

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)


----------



## Didier Guillion (13 Janvier 2009)

Dans la chaine de format du printf, tu specifie %ld, c'est pour afficher un Long Decimal,
pour afficher un double c'est %lf (Long Float)

Cordialement


----------



## anthoprotic (13 Janvier 2009)

Merci mais il m'affiche seulement 31.0000, pas de decimaux (alorsbque ça devrait être 31,666667)!




anthoprotic a dit:


> 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! ). Ma fonction "main.c" doit afficher le résultat de cette somme. Sans plus tarder, le code:
> 
> ...


----------



## Didier Guillion (13 Janvier 2009)

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_


----------



## anthoprotic (13 Janvier 2009)

Merci, j'essaie ça dès que j'ai accès à mon mac!


----------



## anthoprotic (13 Janvier 2009)

Bonjour 

J'ai modifié le code, mais maintenant il ne m'affiche pas le bon nombre!

main.c:


```
int main(int argc, char *argv[])
{
    long somme[6] = {4,3,6,8,2,19};
    long moyenne[3] = {12, 34, 24};
    
    printf("%ld\n\n", sommeTableau(somme, 6));
    
    printf("La moyenne est %lf\n\n", moyenneTableau(moyenne));
    
    
    return 0;
}
```

tableau.c:


```
double moyenneTableau(long tableau[])

{
    
    long i; // notre compteur
    double moyenne = 0;
    
    for(i = 0; i<=sizeof(tableau); i++) // tant que "i" est plus petit que la taille du tableau, on incrémente
        
    {
        moyenne = tableau[i] + moyenne; //on fait un lien vers chaque valeurs du tableau pour les aditionner
    }
    
    moyenne = moyenne / sizeof(tableau); //on fait la moyenne
    
    return moyenne; // on renvoie la moyenne
}
```

Si vous essayez, il renvoie la moyenne 19.25 alors qu'elle devrait être 23.33!


----------



## Didier Guillion (13 Janvier 2009)

Déja, tu fait une confusion sur sizeof qui te donne la taille en octet et non le nombre d'élements.
Reviens a la version où tu passait le nombre d'éléments en parametre.

Cordialement


----------



## anthoprotic (13 Janvier 2009)

Bonjour!

J'ai remodifié mon code, mais maintenant il affiche mon chiffre avec ensuite .333 périodique au lieu de .5 (quand je fais la moyenne dans la fonction) Par exemple, au lieu de m'afficher 3.533 comme moyenne, il m'affiche 3.33333 

main.c


```
int main(int argc, char *argv[])
{
    long somme[6] = {4,3,6,8,2,19};
    long moyenne[3] = {0.6, 4, 6};
    
    printf("%ld\n\n", sommeTableau(somme, 6));
    
    printf("La moyenne est %lf\n\n", moyenneTableau(moyenne, 3));
    
    
    return 0;
}
```


tableau.c


```
// créer une fonction moyenneTableau qui calcule et renvoie la moyenne des valeurs.


double moyenneTableau(long tableau[], long tailleDuTableau)


{
    
    long i; // notre compteur
    double moyenne = 0;


    
    for(i = 0; i<tailleDuTableau; i++) // tant que "i" est plus petit que la taille du tableau, on incrémente
        
    {
        moyenne = tableau[i] + moyenne; //on fait un lien vers chaque valeurs du tableau pour les aditionner
    }
    
    moyenne = (moyenne/tailleDuTableau); //on fait la moyenne
    
    return moyenne; // on renvoie la moyenne
}
```


----------



## Didier Guillion (13 Janvier 2009)

Dur, dur... 

Tu as remis le tableau en long au lieu de changer l'entete de la fonction...

Voici le bon code.

Fait gaffe aux types des données...


```
// créer une fonction moyenneTableau qui calcule et renvoie la moyenne des valeurs.


double moyenneTableau(double tableau[], long tailleDuTableau)


{
    
    long i; // notre compteur
    double moyenne = 0;


    
    for(i = 0; i<tailleDuTableau; i++) // tant que "i" est plus petit que la taille du tableau, on incrémente
        
    {
        moyenne = tableau[i] + moyenne; //on fait un lien vers chaque valeurs du tableau pour les aditionner
    }
    
    moyenne = (moyenne/tailleDuTableau); //on fait la moyenne
    
    return moyenne; // on renvoie la moyenne
}
int main(int argc, char *argv[])
{
    long somme[6] = {4,3,6,8,2,19};
    double moyenne[3] = {0.6, 4, 6};
    
    
    printf("La moyenne est %lf\n\n", moyenneTableau(moyenne, 3));
    
    
    return 0;
}
```


Cordialement


----------



## anthoprotic (13 Janvier 2009)

Quelqu'un à une solution?


----------



## Didier Guillion (13 Janvier 2009)

Oui, regarde au dessus...

Cordialement


----------



## anthoprotic (13 Janvier 2009)

Hourra! Ça fonctionne! Merci beaucoup pour ton aide, c'est fou ce que je peux faire des erreurs stupies *se frappe la tête sur le mur*

N.B: J'ai été grillé par ta réponse


----------



## tatouille (13 Janvier 2009)

anthoprotic a dit:


> Merci mais il m'affiche seulement 31.0000, pas de decimaux (alorsbque ça devrait être 31,666667)!




long notes [5] = {87.4,82.5,94.0,92.3,79.0};
printf ( %f, mydouble);

mydouble = 100;
printf ( %f, mydouble / 73);

mydouble = 100;
printf ( %f, mydouble / 73.0);

CQFD

http://tigcc.ticalc.org/doc/htfloats.html

http://www.network-theory.co.uk/gcc/intro/

aussi if (sizeof ... permettrait de gerer

et bonne annee


```
int main(int argc, char *argv[]) {
  int i;
  
  printf("-- argc: %i \n", argc);
  
  for ( i=0 ; i < argc ; i++ )
    printf("-- argv[%i]: %s \n", i, argv[i]);
  
  printf("-- args: ");
  while (argc--)
    printf("%s  ", *argv++);
  
  puts("");
  
  return 0;
}
```


----------



## anthoprotic (13 Janvier 2009)

Bonne année? Peu importe, merci pour les liens.


----------



## tatouille (14 Janvier 2009)

anthoprotic a dit:


> Bonne année? Peu importe, merci pour les liens.




http://www.metacafe.com/watch/1033461/chasse_a_l_orignal_au_quebec_charlevoix/


----------



## anthoprotic (14 Janvier 2009)

Pourquoi me fais-je donc traiter de bûcherons et d'indien par tous les français de ce forum?  Je ne dépèce pas des phoques pour allumer une lampe à l'huile, nous avons l'électricité ici, eh ouais


----------



## Céroce (14 Janvier 2009)

anthoprotic a dit:


> Je ne dépèce pas des phoques pour allumer une lampe à l'huile, nous avons l'électricité ici, eh ouais



Tu veux dire que les chiens de traîneau font tourner une dynamo ? 
Bon, c'est pas tout ça, mais j'enfile mon béret et je pars acheter ma baguette et mon litre de rouge.


----------



## Didier Guillion (14 Janvier 2009)

C'est quand ca ce met à marcher que l'on commence à programmer rééllement...

Reprenons ta ligne :
   printf("La moyenne est %lf\n\n", moyenneTableau(moyenne, 3));

Elle n'est pas tres jolie : si tu rajoute un element à moyenne, tu va être obligé de modifier également la valeur "3". En général, on évite d'avoir des valeurs litérales comme cela dans un programme.

Ton amie est la fonction "sizeof". sizeof donne la taille d'a peu pres n'importe quoi.
par exemple:

sizeof(double) 
va donner la taille en octet nécessaire pour stocker un double.

On va donc pouvoir écrire :


```
// Le nombre d'élement d'un tableau est égal à la taille du tableau que divise la taille d'un  
// élement
   printf("La moyenne est %lf\n\n", moyenneTableau(moyenne, sizeof(moyenne)/sizeof(double)));
```

Cordialement


----------



## anthoprotic (15 Janvier 2009)

Merci du conseil, même si je ne comprends pas trop cette ligne:


```
sizeof(moyenne)/sizeof(double)));
```

Il calcule la taille en octet de moyenne, mais pourquoi divise-t-il?

Hors-sujet: je vous invite à lire ce cour article qui parle de la vague de froid sibérienne qui est présentement installée au Québec (on parle de pointe à -40° Celcius, sans compter le refroidissement éolien)


----------



## Didier Guillion (15 Janvier 2009)

Le nombre d'élements d'un tableau est égal à la taille du tableau que divise la taille d'un élement.

Ok ?

sizeof(moyenne) donne la taille en octet de moyenne
sizeof(double) donne la taille en octet d'un double (un element du tableau)

Donc :

sizeof(moyenne)/sizeof(double)

Donne le nombre d'élements.

Cordialement


----------



## anthoprotic (15 Janvier 2009)

Ah et le nombre en octet d'un double du tableau est toujours identique aux autres double du tableau, si j'ai bien compris?


----------



## Didier Guillion (15 Janvier 2009)

Oui, quelque soit la valeur rangée dans un double, zero ou quatre milliards, le nombre d'octets reservé pour ranger la valeur est identique.

Cordialement


----------



## anthoprotic (15 Janvier 2009)

D'accord, merci du conseil et bonne aprés-midi (ici, il est à peine 7h AM )


----------



## tatouille (15 Janvier 2009)

anthoprotic a dit:


> D'accord, merci du conseil et bonne aprés-midi (ici, il est à peine 7h AM )



il est 7h19 AM _PST _pour moi  une autre chose essaye de programmer en anglais
c'est la langue choisi pour partager nos connaissances et ca permet a quelqu un ne parlant pas francais mais un basic anglais de te comprendre


----------



## grumff (15 Janvier 2009)

tatouille a dit:


> il est 7h19 AM _PST _pour moi  une autre chose essaye de programmer en anglais
> c'est la langue choisi pour partager nos connaissances et ca permet a quelqu un ne parlant pas francais mais un basic anglais de te comprendre


Oui enfin ça, à voir fonction du contexte, c'est un débat sans fin. Si c'est du code écrit par des français pour des français, si c'est pour se retrouver avec des traductions douteuses qu'au final personne comprend, et des commentaires abrégés faute de vocabulaire, autant rester sur du français. La plupart des applis françaises sur lesquelles je suis passé annotées en anglais, c'était assez dramatique. Et du reste j'y ai sans doute contribué. =)


----------



## anthoprotic (16 Janvier 2009)

Oh mais ne vous en faites pas les amis, je ne suis encore qu'en plein apprentissage du C! Mes petits bouts de code ne sont que des tests, c'est pas vraiment sérieux


----------



## grumff (16 Janvier 2009)

anthoprotic a dit:


> Oh mais ne vous en faites pas les amis, je ne suis encore qu'en plein apprentissage du C! Mes petits bouts de code ne sont que des tests, c'est pas vraiment sérieux



Oui mais les bonnes habitudes, plus tôt on les prend, mieux ça vaut.  Surtout en c.


----------



## anthoprotic (16 Janvier 2009)

Bah, de toute façon ça n'a pas une trop grande importance, je n'ai qu'a traduire mes 4-5 lignes de commentaires en anglais..  Je trouvais ça plus pratique en français sur un forum français


----------



## Céroce (16 Janvier 2009)

De toute façon, comme tu dis, ça n'a aucune importance pour l'instant, tu débutes, tu n'es pas en train de contribuer à Firefox.


----------

