Principe
La méthode retenue repose essentiellement sur l'utilisation de l'opérateur sizeof.
Pour déterminer le nombre d'éléments d'un tableau, il faut :
- déterminer la taille du tableau ;
- déterminer la taille d'un élément ;
- diviser la taille du tableau par la taille d'un élément.
On détermine la taille du tableau :
sizeof(array)
On détermine la taille d'un élément :
sizeof(*array)
On peut donc faire le rapport et écrire la macro ITEMS_IN_ARRAY :
/**************************************************************************//** * \def ITEMS_IN_ARRAY * \brief Get number of items in array. ******************************************************************************/ #define ITEMS_IN_ARRAY(array) (sizeof(array) / sizeof(*array))
Mise en œuvre
La macro ITEMS_IN_ARRAY est simple d'utilisation. Il suffit de lui passer en paramètre le tableau dont on souhaite connaître le nombre d'éléments qu'il contient :
#include <stdint.h> #include <stdio.h> /**************************************************************************//** * \def ITEMS_IN_ARRAY * \brief Get number of items in array. ******************************************************************************/ #define ITEMS_IN_ARRAY(array) (sizeof(array) / sizeof(*array)) static char array[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!' }; int main(void) { for (int i = 0; i < ITEMS_IN_ARRAY(array); i++) { printf("%c", array[i]); } return EXIT_SUCCESS; }
Conclusion
Cette macro est à conserver précieusement dans un fichier d'entête. On la retrouvera à de nombreuses reprises dans les développements iDreamMicro.
Elle est d'ailleurs d'ores et déjà disponible sur le dépôt idreammicro-avr.
Enfin, il est important de souligner que cette macro ne fonctionne qu'avec un tableau, un pointeur n'offrant pas la visibilité nécessaire.