replacer les valeurs d' un tableau a 0

Salut ,

habituellement pour initialiser un tableau avec des 0 , version raccourci on peut faire comme ca :

bool zoneArrosee [RELAY_NUMBER_A] = { 0 };

pour remettre les valeurs a zero , je fais :

if ( now.hour() > ( FIN_HEURE_CREUSE + 14 )  ) {
		for ( byte i = 0; i < RELAY_NUMBER_A; i++ ) {
			zoneArrosee [i] = 0;
		}
	}

que fais ce code ?

if ( now.hour() > ( FIN_HEURE_CREUSE + 14 )  )	zoneArrosee [RELAY_NUMBER_A] = { 0 };

la meme chose que ci dessus ou bien il met uniquement l ' indice RELAY_NUMBER_A du tableau zoneArrosee a 0 ?

non, la forme zoneArrosee [RELAY_NUMBER_A] = { 0 };n'est possible qu'à la déclaration du tableau, si vous voulez dire par là initialiser toutes les valeurs du tableau.

il faut passer par la boucle for ou alors comme c'est 0 que vous voulez (donc mettre tous les octets à 0) vous pourriez utiliser memset() (qui va faire la boucle pour vous)

cependant un statement composé (entre accolades) a comme évaluation l'évaluation de se dernière opération. donc {0} ça vaut 0, donc c'est comme faire zoneArrosee [RELAY_NUMBER_A] = 0;on affecte qu'une seule position, celle de RELAY_NUMBER_A (qui sans doute est la dimension du tableau et donc c'est un débordement mémoire)

Bonjour,

J'ajouterai que

bool zoneArrosee [RELAY_NUMBER_A] = { 0 };

n'initialise pas tout le tableau mais seulement le premier élément du tableau.

Si on veut initialiser tout le tableau il faut donner autant de valeurs que le nombre d'éléments du tableau.

ok merci pour vos reponse rapides , je m' en doutais un peu :confused:

du coup , je supprime cette ligne qui peut faire planter le code :grin:

et remet ma boucle de 3 lignes :wink:

kamill:
J'ajouterai que

bool zoneArrosee [RELAY_NUMBER_A] = { 0 };

n'initialise pas tout le tableau mais seulement le premier élément du tableau.

non ce n'est pas nécessaire. vous aurez bien des 0 partout même si c'est une variable locale.
Essayez cela

void setup() {
  int tab1[3] = {0};
  int tab2[3];
  Serial.begin(115200);
  for (int i = 0; i < 3; i++) Serial.println(tab1[i]);
  Serial.println();
  for (int i = 0; i < 3; i++) Serial.println(tab2[i]);
}

void loop() {}

dans la console série vous verrez

[color=purple]
0
0
0

-26366
-26622
-26878
[/color]

le premier tableau a bien été mis à 0 mais le second n'a pas été initialisé et on voit donc ce qui trainait sur la pile à ce moment

si vous mettez autre Chose que 0, seul le premier élément prend cette valeur et les autres sont mis à 0, par exemple

void setup() {
  int tab1[3] = {17};
  int tab2[3];
  Serial.begin(115200);
  for (int i = 0; i < 3; i++) Serial.println(tab1[i]);
  Serial.println();
  for (int i = 0; i < 3; i++) Serial.println(tab2[i]);
}

void loop() {}

va donner

[color=purple]17
0
0

-26366
-26622
-26878

[/color]

heu , ben non justement , c ' est une façon raccourcie specifique a c++ d ' initialiser tous les elements d ' un tableau a 0

citation prise sur ce site : Comment initialiser un tableau en C en attribuant une valeur identique à chaque élément ?

Si la valeur avec laquelle vous souhaitez initialiser les éléments du tableau est 0, alors il existe une notation raccourcie qui fonctionne quelle que soit la taille du tableau mais uniquement avec la valeur 0 :

int monTableau[1000] = { 0 } //Les 1000 éléments du tableau sont initialisés avec la valeur 0

Si le compilateur que vous utilisez pour votre programme est GCC, une notation permet d'initialiser tous les éléments d'un tableau avec la valeur de son choix :

int monTableau[1000] = {[0 ... 999] = 5};

d ' ou ma question de depart , je pensais qu ' il etait possible qu ' un raccourci ( pour replacer toutes les valeurs a 0 ) de la sorte pouvait exister aussi au vu de cette initialisation raccourcie de tableau .

Quand on met une valeur différente de 0, seul le premier élément prend cette valeur, je n'avais pas vu que les autres éléments étaient mis à 0.

kamill:
Quand on met une valeur différente de 0, seul le premier élément prend cette valeur, je n'avais pas vu que les autres éléments étaient mis à 0.

oui c'est quand même un ordre d'initialisation et la valeur par défaut c'est 0 sauf si on dit autre chose

Dans le standard on peut même définir que certaines valeurs du tableau par exemple

const uint8_t MAX = 200;
uint8_t a[MAX] = {1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 1};

initialise a[0] = 1, a[1] = 3,... et les 5 dernières valeurs à 8,6,4,2,1 et entre les 2 ce serait 0.

Mais... notre compilateur ne gère pas les initialisation "non triviales" donc on peut pas :frowning:

J-M-L:
Dans le standard on peut même définir que certaines valeurs du tableau

On en apprend tous les jours.

Oui cf la doc sur l’initialisation des tableaux