Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

initialiser une structure remplie de tableaux

6 réponses
Avatar
Mouarf
bonjour à tous,

dans un bout de programme j'utilise un double tableau de taille 'n x m',
chaque élément est une structure de 'p' champs qui sont des fractions de
unsigned int (quelques bits), la taille de la structure est 16.

Je souhaite pouvoir affecter à tous les champs de tous les éléments du
tableau la valeur zero très simplement (ie: avec une ligne ou 2 de code)
avec une constante, une macro ou autre mais je ne sais pas comment faire.


Qqun pourrait-il me guider?

Merci d'avance.

6 réponses

Avatar
Mouarf
bonjour à tous,

dans un bout de programme j'utilise un double tableau de taille 'n x m',
chaque élément est une structure de 'p' champs qui sont des fractions de
unsigned int (quelques bits), la taille de la structure est 16.

Je souhaite pouvoir affecter à tous les champs de tous les éléments du
tableau la valeur zero très simplement (ie: avec une ligne ou 2 de code)
avec une constante, une macro ou autre mais je ne sais pas comment faire.

Qqun pourrait-il me guider?

Merci d'avance.
Avatar
Guillaume L.
bonjour à tous,


Bonjour,


dans un bout de programme j'utilise un double tableau de taille 'n x m',
chaque élément est une structure de 'p' champs qui sont des fractions de
unsigned int (quelques bits), la taille de la structure est 16.

Je souhaite pouvoir affecter à tous les champs de tous les éléments du
tableau la valeur zero très simplement (ie: avec une ligne ou 2 de code)

Qqun pourrait-il me guider?


Je te propose un truc tout bête :

for(int i=0; i<n; ++i)
{
tab[i] = calloc(n, sizeof(struct ta_structure));
/* ou bien (void)memset(tab[i], 0, m * sizeof(struct ta_structure)); */
}

Ou encore passer par :

for(int i=0; i<n; ++i)
{
for(j=0; j<m; ++j)
{
(void)memset(tab[i][j], 0, sizeof(struct ta_structure));
}
}


Je ne sais pas si j'ai bien répondu à ta question (nuit blanche, tout ca).


Guillaume Leconte

--
You're not a beautiful and unique snowflake.

Avatar
cedric
Je souhaite pouvoir affecter à tous les champs de tous les éléments du
tableau la valeur zero très simplement (ie: avec une ligne ou 2 de code)


Bonjour.

Si votre objet est d'allocation statique (variable globale ou bien
définie localement mais avec 'static'), alors il n'y a rien de spécial à
faire, toutes les variables de type d'allocation statique étant
initialisée à zéro par défaut, et ceci étant vrai également pour les
tableaux, les structures, etc...

Si votre variable est automatique (locale), vous devez expliciter au
moins le premier initialiseur, et dire qu'il vaut zéro. Les autres
entrées du tableaux seront initialisées à zéro aussi (non pas parce que
le premier vaut zéro, mais parce qu'ils sont initialisés à la valeur par
défaut, zéro).

Dans les deux cas, il est plus sympa de faire figurer l'initialisateur,
histoire de bien signaler que vous n'initialisez pas votre variable dans
le code à dessein.

Exemple :

struct {
int i;
float f;
void *p;
} ma_variable[10][5] = {
{
{ 0, 0, 0 }
}
};

Voilà, en esperant ne être tombé à côté de la question (aïe).

Avatar
Mouarf
"cedric" schrieb im Newsbeitrag
news:42dbf516$0$28662$
Je souhaite pouvoir affecter à tous les champs de tous les éléments du
tableau la valeur zero très simplement (ie: avec une ligne ou 2 de code)


Bonjour.

Si votre objet est d'allocation statique (variable globale ou bien définie
localement mais avec 'static'), alors il n'y a rien de spécial à faire,
toutes les variables de type d'allocation statique étant initialisée à
zéro par défaut, et ceci étant vrai également pour les tableaux, les
structures, etc...

Si votre variable est automatique (locale), vous devez expliciter au moins
le premier initialiseur, et dire qu'il vaut zéro. Les autres entrées du
tableaux seront initialisées à zéro aussi (non pas parce que le premier
vaut zéro, mais parce qu'ils sont initialisés à la valeur par défaut,
zéro).

Dans les deux cas, il est plus sympa de faire figurer l'initialisateur,
histoire de bien signaler que vous n'initialisez pas votre variable dans
le code à dessein.

Exemple :

struct {
int i;
float f;
void *p;
} ma_variable[10][5] = {
{
{ 0, 0, 0 }
}
};

Voilà, en esperant ne être tombé à côté de la question (aïe).


merci pour votre réponse,

ca m'arrange bien que les variables statiques soient initialisées à zero,
d'ailleurs sont-elles initialisées à zero par le programme au démarrage ou
par le système lors de l'allocation.

Maintenant une autre question pour la culture, est-ce possible de créer
{{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},...,{0,0,0,0,0,0,0,0,0,0}} (n
fois) à l'aide d'une macro?


Avatar
Antoine Leca
En <news:42dcfcaf$0$20512$, Mouarf va escriure:

ca m'arrange bien que les variables statiques soient initialisées à
zero, d'ailleurs sont-elles initialisées à zero par le programme au
démarrage ou par le système lors de l'allocation.


Je ne suis pas vraiment Normand, mais là la bonne réponse c'est
« ça dépend ».

En plus, la différence entre l'un et l'autre est parfois très fine (certains
programmes passent le plus clair de leur temps durant l'initialisation à
appeler le « système »).

Maintenant une autre question pour la culture, est-ce possible de
créer
{{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},...,{0,0,0,0,0,0,0,0,0,0}}
(n fois) à l'aide d'une macro?


Une seule je ne pense pas, il va falloir utiliser plusieurs macros.
De plus, quelque chose de simple je ne vois pas (pas de #for au nivau du
préprocesseur).

Donc il reste les techniques de manipulations de morceaux de chaînes de
caractères pour obtenir ce que tu veux, mais le résultat n'est pas quelque
chose de très jojo, ÀMHA.
Le plus simple qui me vient à l'esprit pour le moment c'est du genre (en
supposant n inférieur ou égal à 077, pas de problème théorique s'il faut
plus, je pense que le principe est clair)

/*...*/ = {
#define un {0,0,0,0,0,0,0,0,0,0}
#if n & 1
un,
#endif
#if n & 2
un, un,
#endif
#if n & 4
un, un, un, un,
#endif
#if n & 010
un, un, un, un, un, un, un, un,
#endif
#if n & 020
un, un, un, un, un, un, un, un,
un, un, un, un, un, un, un, un,
#endif
#if n & 040
un, un, un, un, un, un, un, un,
un, un, un, un, un, un, un, un,
un, un, un, un, un, un, un, un,
un, un, un, un, un, un, un, un,
#endif
#undef un
};


Antoine

Avatar
Horst Kraemer
"Mouarf" wrote:

bonjour à tous,

dans un bout de programme j'utilise un double tableau de taille 'n x m',
chaque élément est une structure de 'p' champs qui sont des fractions de
unsigned int (quelques bits), la taille de la structure est 16.

Je souhaite pouvoir affecter à tous les champs de tous les éléments du
tableau la valeur zero très simplement (ie: avec une ligne ou 2 de code)
avec une constante, une macro ou autre mais je ne sais pas comment faire.


Qqun pourrait-il me guider?



memset( array, 0, n*m*sizeof **array);


--
Horst