Variable locale

Bonjour a tous,

J'essaye d'utiliser les variable locales dans mes codes.

Dans le code ci-dessous, la variable local score affiche toujours 1.

Je comprend pourquoi, a chaque fois que le programme lit int score, il remet la variable a 0.

Il y a t'il un moyen pour éviter ça, sans passer par une variable global.

Merci

const byte button = A2;

void setup() {
  Serial.begin(9600);
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  checkButton();
}

boolean checkButton() {
  int score;

  if (digitalRead(button) == !HIGH) {
    score++;
    Serial.print(score);
  }
}

L'utilisation d'une variable locale est inadaptée.
Une variable locale peut prendre n'importe quelle valeur lors de son instanciation. Dans ton cas, le hasard veut qu'elle soit à zéro.

Cette variable doit être obligatoirement statique.

donc :

boolean checkButton() {
 static int score;

 if (digitalRead(button) == !HIGH) {
   score++;
   Serial.print(score);
 }
}

et pour compléter la réponse de hbachetti, il est théoriquement nécessaire d'initialiser la variable:

static int score = 0;

L'initialisation a lieu une seule fois, lorsque le processeur execute cette ligne pour la première fois.
Une autre solution consiste à déclarer la variable en dehors de la fonction, comme variable globale...

Théoriquement, le startup de tout programme C initialise toutes les variables statiques et globales à ZÉRO, donc inutile de s’en préoccuper, sauf si l’on a besoin d’une valeur différente.

hbachetti:
Théoriquement, le startup de tout programme C initialise toutes les variables statiques et globales à ZÉRO, donc inutile de s'en préoccuper, sauf si l'on a besoin d'une valeur différente.

Bonjour,

Je pense que ce n'est pas dans la spécification C ou C++.

Effectivement, avec le compilateur de l'IDE, j'ai constaté que les variables statiques et globales étaient initialisées à 0. Sans doute une extension du compilateur.

Cependant, à mon avis il est préférable d'initialiser ces variables si nécessaire.

Merci pour vos réponses

Pour être sûr de bien comprendre.

  • Variable globale
int variable=0;
void setup(){
}

Durée de vie : Tout le programme.
Initialisation : Une fois.

  • Variable locale
void function(){
  int variable=0; 
}

Durée de vie : Le temps d'utilisation de la fonction.
Initialisation : A chaque lecture de la fonction.

  • Variable locale static
void function(){
  static int variable=0; 
}

Durée de vie : Tout le programme.
Initialisation : Une fois.

Donc en terme de consommation de RAM, la variable global et local static c'est pareil.
La seul différence est que la variable local static ne peut pas être lu dans une autre partie du programme.

J'ai bon ? :wink:

Merci

Oui :slight_smile:

Merci