Vous pouvez utiliser memset
, mais seulement parce que notre sélection de types est limitée aux types intégraux.
Dans le cas général, en C, il est donc logique d'appliquer une macro
#define ZERO_ANY(T, a, n) do{\
T *a_ = (a);\
size_t n_ = (n);\
for (; n_ > 0; --n_, ++a_)\
*a_ = (T) { 0 };\
} while (0)
Cela vous donnera le C++fonctionnalité qui vous permet de "remise à zéro" un tableau d'objets de tout type, sans avoir à recourir à des hacks comme memset
. En gros, c'est un C analogique de C++ modèle de fonction, sauf que vous devez spécifier le type de l'argument explicitement.
En plus de cela, vous pouvez construire un "modèle" pour les non-pourri des tableaux
#define ARRAY_SIZE(a) (sizeof (a) / sizeof *(a))
#define ZERO_ANY_A(T, a) ZERO_ANY(T, (a), ARRAY_SIZE(a))
Dans votre exemple, il serait appliquée que
int a[100];
ZERO_ANY(int, a, 100);
// or
ZERO_ANY_A(int, a);
Il est également intéressant de noter que spécifiquement pour les objets de types scalaires, on peut mettre en œuvre un type indépendant de la macro
#define ZERO(a, n) do{\
size_t i_ = 0, n_ = (n);\
for (; i_ < n_; ++i_)\
(a)[i_] = 0;\
} while (0)
et
#define ZERO_A(a) ZERO((a), ARRAY_SIZE(a))
en tournant l'exemple ci-dessus en
int a[100];
ZERO(a, 100);
// or
ZERO_A(a);