Mon programme s'étoffant, je me retrouve avec ce message :
"Le croquis utilise 17654 octets (57%) de l'espace de stockage de programmes. Le maximum est de 30720 octets. Les variables globales utilisent 1694 octets (82%) de mémoire dynamique, ce qui laisse 354 octets pour les variables locales. Le maximum est de 2048 octets. La mémoire disponible faible, des problèmes de stabilité pourraient survenir."
Bien entendu, j'ai fait le tri et les variables ne nécessitant pas d'être globales ont été transférées dans leurs fonctions respectives. Je ne peux pas en transférer plus.
Dans les variables globales, sont également déclarés 10 messages pour le LCD tels que celui-ci :
J'ai transféré chacun de ces messages dans leurs fonctions spécifiques ; elles sont donc devenues des variables locales.
Je pensais réduire d'autant la volume des variables globales, mais leur volume reste identique que ces 10 messages soient déclarés comme variables globales ou comme variables locales (dans leurs fonctions respectives).
La question peut être que ferais-je si je devais écrire le compilateur. Il y a une chaine locale qui donc doit être initialisée après l'appel de la fonction. Il faut donc que la chaîne qui permette l'initialisation soit rangée quelque part. Une solution que je vois est de la mettre en variable globale inaccessible et d'en faire une copie locale à l'exécution de la fonction. On a alors deux fois plus de place utilisée. Ce n'est pas génial.
On peut aussi faire, si la variable n'est pas modifiée, la définir comme une fonction locale mais du type static. C'est une variable qui ressemble à une variable locale mais qui est en réalité globale. Du coup cela pourrait ne pas changer la taille des variables.
Si un programme a 1000 octets de variables globales et 0 variables locales, en passant 500 octets de variables globales en locales, le compilateur ne va plus rien dire, mais l'espace occupé peut être le même. On y gagne en taille que si les fonctions n'utilisent pas toutes les variables.
Quand se fait sentir le manque de place, on peut, comme le suggère Henri, utiliser la macro F(), et on trouve bien souvent des variables intermédiaires que l'on peut supprimer, par exemple:
etatBouton = digitalRead(bouton);
if (etatBouton == HIGH) ....
qui peut s'écrire:
if (digitalRead(bouton) == HIGH) ....
Et qui peut faire économiser un octet (même deux si on a pris l'habitude de définir les etatBouton par un int).
Supprimer des variables non indispensables est à la porté d'un programmeur averti, connaitre et utiliser F() est à la porté d'un programmeur pas débutant mais presque. Il y a pour moi une contradiction.