Partage
  • Partager sur Facebook
  • Partager sur Twitter

For...each

11 décembre 2018 à 19:10:34

Bonjour,

J'aimerai savoir pour "for...each" ne fonctionne pas pour la modification des valeurs d'un tableau fourni en paramétre d'une fonction ?

Merci de votre aide.

  • Partager sur Facebook
  • Partager sur Twitter
11 décembre 2018 à 22:33:20

Salut, je ne vois pas pourquoi ça ne fonctionnerait pas.. Peux-tu nous montrer ton code?
  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2018 à 13:06:29

Bonjour,

Effectivement, voici un exemple :


for (int val : array) {
    val = newValue;
}

 Ici val est une variable de type int qui récupère la valeur de chaque élément du tableau array.
Donc dans cet exemple on modifie la valeur de val mais pas la valeur du tableau.

En revanche, si tu fais :

for(int i = 0; i < array.lenght; i++) {
   array[i] = newValue;
}

Ici les valeurs dans ton tableau seront bien modifié.

  • Partager sur Facebook
  • Partager sur Twitter
14 décembre 2018 à 11:27:29

Bonjour,

La syntaxe for...each permet d'affecter les différentes entrées d'un tableau (ou d'une collection) à une valeur locale telle que "val". Cette valeur n'existe que dans la boucle for. Tu ne travailles pas directement sur les valeurs du tableau mais sur une copie de ces valeurs qui ne sera plus accessible une fois sorti de la boucle. Si tu veux modifier les valeurs du tableau, il faut y faire référence avec la syntaxe "array[i]". Le deuxième bout de code que tu proposes est la manière la plus élégante de modifier les valeurs d'un tableau. Si tu tiens absolument à utiliser la syntaxe for...each, tu peux écrire :

int i = 0;
for (int valeur : monTableau) {
	monTableau[i] = newValeur;
	i++;
}

... mais c'est moins classieux!

-
Edité par @rtur 14 décembre 2018 à 11:29:36

  • Partager sur Facebook
  • Partager sur Twitter
14 décembre 2018 à 11:52:33

Bon en fait c'est un peu plus subtil que ça.

Si on a un tableau d'_objets_, la boucle "for each" ne permettra certes pas de remplacer les objets, mais d'interdit pas de leur appliquer une méthode qui change leur état

for(Figure f : mes_figures) {
   f.decaler(10, 20);
}

Donc on ne modifie pas le _conteneur_ (le tableau contient les mêmes objets après la boucle), mais les objets désignés par les références qu'il contient.

Evidemment, z-allez-me-dire, ton truc c'est pas vrai pour un tableau d'entiers int, ou de chaines, par exemple

Bin oui en fait non. La boucle parcourt le _contenu_ du tableau, qui contient des références à des trucs immutables.

Quand on écrit n = n + 1; au départ n contenait la référence à une constante (par exemple 10), et après il contient la référence à une autre constante (11). calculer 10 + 1, ça ne change pas 10.



-
Edité par michelbillaud 14 décembre 2018 à 11:54:16

  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2018 à 16:44:39

Merci pour vos réponses.
  • Partager sur Facebook
  • Partager sur Twitter