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.