Je voudrais faire trois tableaux de la même longueur. Selon la documentation , les tableaux doivent être définis comme int myArray[10];
où 10 peut être remplacé par une longueur connue (un autre entier) ou rempli par un tableau {2, 3, 5, 6, 7}
.
Cependant, quand je tentais de déclarer une valeur int arrSize = 10;
et un tableau en fonction de cette taille int myArray[arrSize];
, je reçois les points suivants: error: array bound is not an integer constant
.
Existe-t-il un moyen de déterminer de manière variable la taille des tableaux, ou dois-je simplement les coder en dur? (On m'a appris que le codage en dur est mauvais et quelque chose à éviter à tout prix.)
programming
variables
code-optimization
user3.1415927
la source
la source
Réponses:
Votre question comporte en fait 2 parties.
1 / Comment puis-je déclarer la taille constante d'un tableau en dehors du tableau?
Vous pouvez soit utiliser une macro
ou utilisez une constante
si vous avez initialisé le tableau et que vous devez connaître sa taille, vous pouvez faire:
le second
sizeof
concerne le type de chaque élément de votre tableau, iciint
.2 / Comment puis-je avoir un tableau dont la taille est dynamique (c'est-à-dire inconnue jusqu'à l'exécution)?
Pour cela, vous aurez besoin d'une allocation dynamique, qui fonctionne sur Arduino, mais n'est généralement pas conseillée car cela peut entraîner la fragmentation du "tas".
Vous pouvez faire (voie C):
Ou (façon C ++):
Pour plus d'informations sur les problèmes de fragmentation de segment, vous pouvez vous référer à cette question .
la source
ARRAY_SIZE = sizeof myArray / sizeof myArray[0];
, vous pouvez ainsi changer le type de myArray sans introduire de bugs. Pour la même raison,myArray = realloc(myArray, size * sizeof *myArray);
. BTW, lancer la valeur de retour demalloc()
ourealloc()
est également inutile. 2) La vérificationmyArray != 0
dans la version C est inutile, car ellerealloc(NULL, sz)
est équivalente àmalloc(sz)
.La taille du tableau doit être connue au moment de la compilation. Sinon, vous devez allouer de la mémoire dynamiquement en utilisant:
où x (un entier) peut être défini dans le code de l'application (vous pouvez le charger depuis eeprom si vous voulez que ce soit un paramètre persistant mais configurable).
Cependant, si vous voulez simplement déclarer des tableaux de la même taille, il vous suffit de déclarer le nombre une constante comme ceci:
Je pense que ne pas coder les choses en dur n'a de sens que si l'on peut raisonnablement s'attendre à ce que l'utilisateur veuille changer le réglage à un moment donné. Je ne sais pas si c'est le cas.
la source
Si vous connaissez la longueur maximale du tableau, il suffit d'initialiser le tableau à cette longueur et d'utiliser un entier pour indiquer au programme la quantité de ce tableau à utiliser. Si c'est la différence entre 7,10 octets, vous ne perdez pas autant d'allocation de mémoire.
la source
Je sais que je suis un peu en retard ici, mais en théorie, les tableaux réguliers ne peuvent pas être créés à l'aide d'une variable pour définir la quantité d'éléments que le tableau aura comme:
Cela affichera une erreur car lors de la déclaration du tableau, le programme s'attend à ce que la valeur entre les crochets soit constante. Pourtant, il existe un moyen de créer un tableau avec une variable définissant la quantité de valeurs que ces tableaux vont avoir grâce à l'allocation de mémoire dynamique pour les ensembles de valeurs (cette méthode a été testée avec des tableaux monodimensionnels uniquement, je n'ai pas essayé depuis multidimensionnel pour le moment), et ça se passe comme ceci:
Après cela, tout ce qui reste à faire est d'attribuer une valeur à chaque élément créé dans l'instance myArray (qui est déjà un tableau à présent) comme vous le feriez pour un tableau normal créé en tant que myArray [arrSize].
la source