IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

for étendu: Warning d'inutilisation


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for( short ligne[] : tablo_pointage )
    	Arrays.fill(ligne, (short)0);

    a++

  3. #3
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    tablo_pointage[ index1 ][ index2 ] = 36;
    En tout cas, merci aussi pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for( short ligne[] : tablo_pointage )
      for( @SuppressWarnings( "unused" ) short element : ligne )
        element = 0;

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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++

  5. #5
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/03/2007, 00h53
  2. Réponses: 2
    Dernier message: 21/10/2006, 16h32
  3. Réponses: 11
    Dernier message: 19/05/2006, 11h41
  4. Strlen dans un for = Warning ?
    Par Mike888 dans le forum C
    Réponses: 9
    Dernier message: 12/01/2006, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo