Debutant arduino recherche aide !

Bonjour a tous
voila ceal fai deux semaine que je travaille sur l’arduino en essayant different programe et montage !
je suis en train d’essayer de me faire comme beaucoup sur le forum un thermostat
je ne souhaite pas reprendre un code deja fait mais plutot partire de ZERO!
mon probleme et le suivant :
-je debut en c+
-je souhaite réaliser une fonction qui faire des moyenne sur X valeur !
par exemple ma fonction devra lorsque je l’appelle avec deux parametre comme" la temperature relevé" et “le nombre de valeur prise en compte dans la moyenne”
me renvoyer la moyenne .
jai donc ecris ce bous de code :

float MOYENNE(float val,int NBval){
  float moyenne=0;//initialisation de la moyen a 0
  
  float val [NBval];//création d'un tableau de valeur val à NBval cases
  //ici création d'une boucle qui va rentrer le valleur val dans les cases
  for (i=0;i<NBVAL;i++){
    val[i]=val;
    delay(100);};
  //ici création de la boucle qui va permetre de calcule le total des valeur du tableau
  for (i=0;i<NBval;I++){
    float total=0;
    float total=total+val[i];};
  //ici calcule de la moyenne
  float moyenne=total/NBval;
  MOYENNE=moyenne;
  return MOYENNE;}

le souci que j’ai c’est que le compilateur me renvois l’erreur suivante
declaration of ‘float val [(((unsigned int)(((int)nbval) + -0x000000001)) + 1)]’ shadows a parameter
dont je ne comprent pas la signification! :blush:
si quelqu’un peut m’aider , car malgré mes recherche sur le forum ou internet je ne trouve pas !
merci

Bonjour,

Bon je vais être franc, je vais pas y aller par 4 chemins, il faut que tu lises des cours de c !
Les déclarations des variables sont fausses, la syntaxe des boucles for n’est pas respecté, …
http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html (prend le temps de lire/apprendre les parties 1 & 2)

Les problémes les plus “critiques” que je vois :

float MOYENNE(float val,int NBval) -> un nom de fonction si on veut bien faire doit respecter la convention "lowercase" soit tout en minuscule, seul les macro et les constante sont en majuscule.
float val [NBval]; -> pas d'espace entre val et [NBval]
for (i=0;i<NBVAL;i++){ -> i n'est pas déclaré
    val[i]=val; ->val est une variable passé fixe en argument, ton tableau est donc remplit avec la même valeur -> moyenne = val
    delay(100); 
}; -> pas de ; à la fin d'une boucle for
for (i=0;i<NBval;I++){ -> i n'est pas déclaré
    float total=0; -> déclaration d'une variable locale "total" 
    float total=total+val[i]; -> redéclaration de "total" = erreur, incohérence total=total+val[i]; vu que tu viens de définir total à 0
}; -> pas de ; à la fin d'une boucle for
float moyenne=total/NBval; -> la variable "moyenne" a déja était déclaré au début de la fonction, redéfinition = erreur
MOYENNE=moyenne; -> la variable MOYENNE n'as pas était déclaré, en plus elle porte le même nom que la fonction, suivant la version du compilateur utilisé ça donnera un comportement indéterminé.

Ya encore du bouleau mais tu devrai t’en sortir facilement :wink:

Fonction de calcul de moyenne sur n mesures :

float moyenne(byte nbMesure){
  float total = 0;

  for (byte i = 0; i < nbMesure; i++) {
    total += fonctionRetournantUNEmesure();
    delay(100);
  }

  return total / nbMesure;
}

// fonction qui retourne une mesure
float fonctionRetournantUNEmesure() {
  // ... fait la mesure et retourne un float
}

Heloderma-kris:

float MOYENNE(float val,int NBval)

float val [NBval];//création d’un tableau de valeur val à NBval cases




le souci que j'ai c'est que le compilateur me renvois l'erreur suivante
declaration of 'float val [(((unsigned int)(((int)nbval) + -0x000000001)) + 1)]' shadows a parameter

Hormis les erreurs de syntaxe et convention, tout comme Sky a corriger ta double déclaration sur “total”, ici tu as du faire la même chose avec NBval tu as du la déclaré plus haut en global donc double déclaration l’un cache l’autre d’où le “shadow a parameter”.

OK merci a vous pour ces reponse , vu que je pije pas tout je vais retourner voir le site du zero ! :roll_eyes: j'avais essayer de m'aider de ce doc http://sciences.siteduzero.com/tuto_pdf.php?vrsid=569934 mais bon c'est toujours pas sa donc je reviendrai quand j'aurai piger les notion de local et global merci

Voir ce que l’on appel la portée (visibilité) des variables.
Global ce sont des variables qui existent tout au long de l’exécution de ton programme et peuvent être vue dans tous le code, elles se trouvent en dehors de tous bloc {},on la(les) déclare généralement en premier avant toute fonction ou autre.
Local ce sont des variables à existence courte elles ne sont valable que le temps d’exécution d’une fonction, boucle, condition et ne peuvent être vue en dehors de leur bloc ,limites “{ }”, une fois sorti elle n’existent plus.

int entier; //globale au programme, toute modification sera conservé tout le long de l'exécution du programme

void loop()
{
  float flottant;  //local à loop une fois sorti de boucle , flottant n'existera plus, elle ne pourra être vue en dehors de ses limites {}
                         // (!particularité arduino,voir la fonction loop comme une boucle infinie qui s’exécute tout au long de ton programme, si tu déclare une variable ici elle n'existera plus au prochaine cycle)
  if(condition)
  {
    char caract; // local au if une fois sorti du if caract n'existera plus, elle ne pourra être vue en dehors de ses limite {}
    entier = 2; //déjà déclaré en global pas besoin de redéfinir sont type int, elle conservera la valeur 2 même en sortie de condition.
  }

  for(int i = 0; i < entier; i++) //'i' est local à 'for' une fois sorti de boucle 'i' n'existera plus, elle n'est visible que dans ses limites {}.
  {                                         //(c'est pour celà qu'il faut la déclaré car elle n'existe pas encore "int i = 0")
  }

}

void maFonction(int variable)// 'variable' est local à la fonction
{
  entier = 1; // déjà déclaré en global pas besoin de redéfinir sont type int, elle conservera la valeur 1 même en sortie de fonction.

  int entier2 = entier; // local à la fonction elle n'a pas encore été déclarée, à ça sortie elle n'existera plus et au prochain appel de la fonction elle n'aura pas gardé ça valeur.
}

Heloderma-kris:
j’avais essayer de m’aider de ce doc http://sciences.siteduzero.com/tuto_pdf.php?vrsid=569934 mais bon c’est toujours pas sa donc je reviendrai quand j’aurai piger les notion de local et global
merci

Ca ne m’étonne pas que tu ais eu un problème avec tes variables, d’après le doc que tu as mis du site du zéro il ne parle nullement de variables ou même du typages de variables …
Peut être suivre le cours de mateo plutôt ?

:wink:

oui c'est bien ce que je me disais il me manquer des infos! pour moi qui suis chimiste de formation le langage informatique n'est pas simple a comprendre au depard, mais bon je me suis bien fait au basse du html et du css je me dit que tout n'est pas perdu! au moins je viens de comprendre le code de skywodd qui finalement ne ce prend pas la tete avec un tableau pour stocke des valeur! :~

Heloderma-kris:
oui c’est bien ce que je me disais il me manquer des infos!
pour moi qui suis chimiste de formation le langage informatique n’est pas simple a comprendre au depard, mais bon je me suis bien fait au basse du html et du css je me dit que tout n’est pas perdu!

Courage, le c/c++ ça s’apprend relativement facilement une fois que les bases sont solide (fonctions, boucles, pointeurs, …)

Heloderma-kris:
au moins je viens de comprendre le code de skywodd qui finalement ne ce prend pas la tete avec un tableau pour stocke des valeur!

Toujours faire au plus simple :wink:
Un tableau ça prend du temps, ça consomme de la ram (ram précieuse, sur un pc la ram ça se compte en Go, sur un microcontrôleur on la compte en Ko (2Ko pour arduino))

Merci osaka ton explication est très :) claire!

Yop, De rien on est tous passé par là =( XD, il faut dire que la programmation n'est pas quelque chose d'intuitif mais il y a une certaine logique à acquérir :grin:.