Question de débutant sur une vriable globale et fonction

Bonjour, Je m'excuse de vous poser cette question. J'ai appris Arduino et C++ grace a Google et aux forums et je me rends que d'apprendre en documentant laisse des fois des flous. Je me suis aussi inspiré d'une librairie pour créer mes fonctions et je suis maintenant dans le doute sur un truc.

Si je déclare une variable globale

char fix[80];

Cette vraiable pourra être utilisée dans plusieurs fonctions, ce qui n'est pas le cas si je déclare une variable dans une fonction car elle se détruit aussi tôt sorti.

Scénario 1

char fix[80];
imprimer();
void imprimer()
{
Serial.print(fix);
}

On est d'accord que je vais afficher la valeur de fix

Scénario 2

char fix[80];
imprimer(fix)
void imprimer(fix) // Ca sert à rien de mettre fix ici
{
Serial.print(fix);
}

On est d'accord que je vais afficher la valeur de fix, mais ca ne sert à rien de passer fix en parametre

Scénario 3

char fix[80];
imprimer(fix);
void imprimer(data)
{
Serial.print(data);
}

La valeur de fix sera affichée

Scénario 4

char fix[80];
imprimer(fix);
void imprimer(data)
{
memset(fix,'\0',FIXSIZE);
Serial.print(data);
}

La valeur de fix va sera affichée???? Je ne crois pas

Scénario 5

char fix[80];
imprimer(fix);
void imprimer(data)
{
char* d_ata = data;
Serial.print(d_ata);
}

La valeur de fix sera affichée

En fait quel est la façon la plus propre 1) d'utiliser une vriable global qui peut etre utiliser dans 1 ou 2 fonction, 2) de passer en paramètre un variable, ou une valeur qui n'appartient pas forcément à un variable global.

Voyez-vous?

Bonjour,

En général c'est mieux de rendre la fonction autonome, c'est à dire de passer les variables en argument, mais ça dépend du contexte. Une variable globale bien utilisée peut être efficace. Si tu dois utiliser la fonction pour plusieurs variables, bien sur tu dois passer la variable à utiliser.

Par contre dans tes exemples tu passes un tableau, ce n'est pas forcément le cas le plus simple à comprendre. Quand tu passes un tableau ce qui est passé en argument est l'adresse du tableau, donc la fonction travaille sur le tableau global. Ansi dans

char* d_ata = data;
memset(fix,'\0',FIXSIZE);
Serial.print(d_ata);

Dans le Serial.print la variable pointée par d_ata (qui est fix) ne contient que des \0

D'accord mais qu'es-ce qu'il y a de mieux entre le scénario 1 et 2. J'ai corrigé le scénario 2. Pour le scénario 5, es-ce qu'il y a un intéret de passer la valeru du parametre dans une variable locale.

char fix[80];
imprimer(fix);
void imprimer(data)
{
char* d_ata = data; // Je décide de travailler avec un variable local et plus avec la valeur passé en paramètre de la fonction. Dans quelle circonstance on devrait faire ca correctement?
Serial.print(d_ata);
}
  1. Ton scenario 2 est exactement le même que le scenario 3. Même si tu donne le même nom au paramètre que la variable globale, c'est bien le paramètre qui sera pris en compte dans la fonction

  2. Dans ton cas 5 la variable globale ne sert a rien

La déclaration des fonctions imprimer est incorrecte. Met la déclaration complète, ça t'aidera sans doute mieux à comprendre ce qui se passe à l'appel

Tu peux déclarer imprimer() comme ceci

void imprimer(char data[80])
{
  Serial.print(data);
}

ou comme cela

void imprimer(char *data)
{
  Serial.print(data);
}

Les deux cas sont a peu près équivalent: c'est l'adresse du tableau qui est passé à la fonction, sauf que dans le premier cas la fonction connait la taille du tableau et pas dans le second.