Bonjour à tous,
Dans une procédure j'essaye (sans succès) d'initialiser un tableau avec un paramètre passé en argument d'une procédure genre :
int Compteur(byte NbCHIFFRE) // maximum 4 chiffres (9999)
{
int CHIFFRE[NbCHIFFRE];
}
appelée par le code Compteur(x); // où x vaut de 1 à 4
Celà provoque une erreur de syntaxe :"L'expression doit avoir une valeur de constante. Impossible d'utiliser la valeur de paramètre "NbCHIFFRE" comme constante".
Bon, j'ai déclaré "int Compteur(const byte NbCHIFFRE)" ... pas mieux.
En vous remerciant d'avance de votre aide
Il n'est pas possible de déclarer un tableau via un paramètre ? ou alors ... il y a quelque chose que je n'ai pas compris
La taille d'un tableau doit être connue au moment de la compilation.
Pour créer des tableaux dont la taille est inconnue à priori, il faut faire de l'allocation dynamique (malloc(), free()) mais sur les petites plateformes comme l'Arduino ce n'est pas trop recommandé car on fractionne la mémoire disponible assez rapidement.
Une variable déclarée à l'intérieur d'une fonction n'est valide qu'a l'intérieur de cette fonction.
Dès que tu sors de la fonction, ces variables n'existent plus.
C'est ce que l'on appelle la portée de la variable
Dans ce cas, la portée est locale
Donc ça ne sert à rien d'initialiser des variables dont les valeurs vont "disparaitre"
Si tu veu conserver la valeur d'une variable dans tout le programme, il faut que ta variable ait une portée globale.
Pour cela il faut déclarer ta variable avant les fonctions ( setup(), loop(), ...)
Dans le cas d'un tableau il faut également indiquer le nombre d'éléments du tableau
int CHIFFRE[4]; /* Variable de type tableau, ayant 4 éléments, de portée globale
setup()
{
}
loop()
{}
Ensuite ta fonction Compteur est incomplète
Il faut lui fournir 2 paramètres
Le premier est l'indice dans le tableau
Le second étant la valeur à mémoriser dfans le tableau
Compteur(int indice, int valeur)
{
CHIFFRE[indice]=valeur;
}
fdufnews:
La taille d'un tableau doit être connue au moment de la compilation.
Hum - il me semble que c’est possible d’avoir une taille de tableau défini par une variable avec les versions récentes des compilos (en C depuis longtemps et depuis C++14 de mémoire dans la spec mais supporté comme extension dans GCC depuis un moment) avec bien sur le respect des règles de portée des variables
L'objectif du programme est tout simplement de pouvoir faire un compteur sur n chiffres (suivant d'où est appelé la procédure) et d'incrémenter un chiffre (de 0 à 9) à la fois (celui des unités, dizaine, centaine ou millier) pour "fabriquer" le nombre du compteur.
D'où l'idée d'avoir un tableau dynamique ... mais sous Arduino.
Alain46, oui pour la portée des variables, et c'est même pire puisque tu peux déclarer une variable dans une boucle qui ne sera valable que pour la boucle.
fdufnews, j'ai découvert cette commande hier, et comme j'ai pataugé avec et vu qu'effectivement l'allocation dynamique de mémoire sur Arduino était risquée (bon là on joue avec 4 octets), j'ai fait ma demande au forum.
J-M-L, j'ai voulu déclarer simplement un nombre de capteur en dynamique pour déclarer un simple tableau de température. Variables déclarée en haut de programme pour une portée la plus grande.
int NB_DS18B20; // Nombre de capteur DS18B20 sur un fil 1-Wire
float TEMPERATURE[NB_DS18B20]; // contient la temperature de chaque capteur
et déjà là, il y a l'erreur de syntaxe "L'expression doit avoir une valeur de constante. Impossible d'utiliser la valeur de paramètre "NbCHIFFRE" comme constante".
j'ai accès à mon arduino, par exemple ce programme contient une fonction test(). Chaque appel à la fonction crée un tableau local (sur la pile) dont la taille est dynamique, le remplit de nombres pseudos aléatoires entre 0 et 100 et retourne un de ces nombres.
ça ne sert pas à grand chose si ce n'est montrer que c'est fonctionnel - vous pouvez tester ce code:
int test(const int taille, const int index)
{
int tableau[taille];
for (int i = 0; i < taille; i++) tableau[i] = random(0, 101);
return tableau[index]; // on ne vérifie pas que index est entre 0 et taille-1
}
void setup() {
Serial.begin(115200);
Serial.println(test(10, 4));
Serial.println(test(50, 22));
}
void loop() {}
va compiler et fonctionner sans soucis
(les const dans la fonction ne sont pas nécessaires mais juste une bonne pratique de dire au compilateur ce qui est modifiable ou pas)
bien sûr quand vous déclarez une variable globale, tout doit être résolu à la compilation, donc
int NB_DS18B20; // Nombre de capteur DS18B20 sur un fil 1-Wire
float TEMPERATURE[NB_DS18B20]; // contient la temperature de chaque capteur
ne peut pas marcher.. mais
const int NB_DS18B20 = 3; // Nombre de capteur DS18B20 sur un fil 1-Wire
float TEMPERATURE[NB_DS18B20]; // contient la temperature de chaque capteur
va fonctionner par exemple et dans votre cas le plus simple c'est de prévoir un nombre max de capteurs que votre code doit supporter et allouer la mémoire en conséquence