Précédent   Forum des professionnels en informatique > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2012, 11h49   #1
Membre Expert
 
Avatar de rtg57
 
Homme
Autodidacte
Inscription : mars 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Autodidacte
Secteur : Service public

Informations forums :
Inscription : mars 2006
Messages : 1 175
Points : 1 435
Points : 1 435
Par défaut for étendu: Warning d'inutilisation

Bonjour,

J'ai un tableau à 2 dimensions que je souhaite initialiser à '0'.
Ce tableau est transmis en paramètre d'une méthode dont voici la partie du code qui nous intéresse:
Code :
1
2
3
4
5
6
7
8
9
10
public void chargeDonnees( short[][] tablo_pointage )
{
  /.../
  // Init du tableau:
  for( short ligne[] : tablo_pointage )
    for( short element : ligne )
      element = 0;
 
  /.../
}
Le souci est que le compilateur m'envoie un Warning en indiquant que 'element' n'est pas utilisé. Avez-vous une explication à cela ?

Bien sûr, je pourrais utiliser la propriété length du tableau est faire 2 boucles for imbriquées:
Code :
1
2
3
for( int ligne = tablo_pointage.length; ligne >= 0; ligne-- )
  for( int element = tablo_pointage[ ligne ].length; element >= 0; element-- )
    tablo_pointage[ ligne ][ element ] = 0;
Je trouve quand même que la 1ère version plus élégante !
__________________
@ bientôt...

Salut & @+ sur 3W!
rtg57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 12h10   #2
Rédacteur/Modérateur
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations professionnelles :
Activité : Développeur Java/Web
Secteur : Transports

Informations forums :
Inscription : avril 2002
Messages : 12 460
Points : 19 447
Points : 19 447
Salut,


Tu ne peux pas modifier les éléments d'un tableau avec le for étendus.
Les valeurs sont simplement stocké dans une variable locale, que tu n'utilise pas (d'où le warning).

Mais bon le plus simple serait d'utiliser Arrays.fill() :

Code :
1
2
for( short ligne[] : tablo_pointage )
	Arrays.fill(ligne, (short)0);

a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 16/01/2012, 12h11   #3
Membre éclairé
 
Avatar de Lady
 
Femme
Développeur Java
Inscription : mars 2003
Messages : 511
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : mars 2003
Messages : 511
Points : 345
Points : 345
Citation:
Envoyé par rtg57 Voir le message
Bonjour,

J'ai un tableau à 2 dimensions que je souhaite initialiser à '0'.
Ce tableau est transmis en paramètre d'une méthode dont voici la partie du code qui nous intéresse:
Code :
1
2
3
4
5
6
7
8
9
10
public void chargeDonnees( short[][] tablo_pointage )
{
  /.../
  // Init du tableau:
  for( short ligne[] : tablo_pointage )
    for( short element : ligne )
      element = 0;
 
  /.../
}
Le souci est que le compilateur m'envoie un Warning en indiquant que 'element' n'est pas utilisé. Avez-vous une explication à cela ?
Je pense que ce bout de code ne va pas faire ce que tu attends ...
La ligne élément = 0; ne met pas une des case de ton tableau à 0 mais fait juste pointé ton paramètre élément sur l'espace en mémoire qui vaut 0 pour un short ....

Sachant que de base le tableau va être initialisé à 0 quoiqu'il arrive (valeur par défaut des type primitifs numérique)
__________________
(Bio)informaticienne folle ... MOUWAWAWAWA
Geekette fan de Marcus et de Nolife !!
Jeune Maman
Lady est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/01/2012, 13h59   #4
Membre Expert
 
Avatar de rtg57
 
Homme
Autodidacte
Inscription : mars 2006
Messages : 1 175
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Autodidacte
Secteur : Service public

Informations forums :
Inscription : mars 2006
Messages : 1 175
Points : 1 435
Points : 1 435
Bonjour et merci de m'avoir répondu rapidement,

Citation:
Envoyé par adiGuba Voir le message
Tu ne peux pas modifier les éléments d'un tableau avec le for étendus.
Les valeurs sont simplement stocké dans une variable locale, que tu n'utilise pas (d'où le warning).
A mon grand étonnement, cela fonctionne: je modifie bien le tableau fourni par le code appelant.
D'après ce que j'ai cru comprendre, seuls les éléments primitifs sont copiés localement sur la pile. Ce qui fait que la modification de leurs valeurs n'est vue que localement.
Par contre, lorsque ce sont des objets (et les tableaux en font partie), c'est l'adresse de l'objet qui est passée. Du coup, la fonction appelée travail réellement sur l'objet situé à cette adresse.

Votre réponse m'a peut être mis sur la piste : peut être que le compilateur ne saisit pas cette astuce. Les objets ligne[] et element sont créés juste pour la boucle d'initialisation. De ce point de vue, ils sont mis à '0' et jamais utilisés par la suite puisque leur portée est simplement cette boucle. D'où l'avertissement.

En réalité, ces zones mémoires sont ensuite remplies par des valeurs, mais elles sont adressées explicitement, genre
Code :
tablo_pointage[ index1 ][ index2 ] = 36;
En tout cas, merci aussi pour
Code :
Arrays.fill(ligne, (short)0);
Je ne connaissais pas. Et cela ne génère pas de Warning.
En ce qui concerne ce petit désagrément, j'ai aussi trouvé ceci:
Code :
1
2
3
for( short ligne[] : tablo_pointage )
  for( @SuppressWarnings( "unused" ) short element : ligne )
    element = 0;
__________________
@ bientôt...

Salut & @+ sur 3W!
rtg57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 14h04   #5
Rédacteur/Modérateur
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 460
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

Informations professionnelles :
Activité : Développeur Java/Web
Secteur : Transports

Informations forums :
Inscription : avril 2002
Messages : 12 460
Points : 19 447
Points : 19 447
Citation:
Envoyé par rtg57 Voir le message
A mon grand étonnement, cela fonctionne: je modifie bien le tableau fourni par le code appelant.
Non cela ne fonctionne pas. Je viens de vérifier avec ce code :

Code :
1
2
3
4
5
6
	short[] ligne = { 1, 2, 3, 4, 5, 6 };
 
	for( @SuppressWarnings( "unused" ) short element : ligne )
		element = 0;
 
	System.out.println(Arrays.toString(ligne));

Comme indiqué par Lady, cela vient surement du fait que les tableaux sont initialisé à zéro par défaut...


a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h10.


 
 
 
 
Partenaires

Hébergement Web