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

avec Java Discussion :

Comment une fonction peut modifier la valeur d'une variable passée en paramètre chez l'appelant ?


Sujet :

avec Java

  1. #1
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut Comment une fonction peut modifier la valeur d'une variable passée en paramètre chez l'appelant ?
    Bonjour,

    Une question de débutant (qui a quand même cherché dans la Faq et sur google) :

    Comment passer une valeur par adresse, ou encore comment l'appelé peut modifier la valeur d'une variable chez l'appelant.

    Un petit exemple de ce que je voudrais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void main()
    {
       Socket socket = new Socket();
       close(socket);
       // ici, je voudrait que l'appelé (la fonction close()) ait mis automatiquement la variable socket à null
    }
     
    void close(Socket s)
    {
       s.close();
       delete s;
       s = null;
    }
    merci d'avance de vos réponses
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 93
    Points
    93
    Par défaut
    Pour être précis tu ne cherches pas à modifier la valeur de l'objet mais la valeur d'un pointeur sur l'objet. En Java, tout est référence donc lors du passage en paramètre un nouveau pointeur sur la même zone mémoire est créé, mais il s'agit bien de deux pointeurs indépendants ce qui explique que ton code ne marche pas. Tu peux faire comme ça si tu tiens vraiment à ce que ça soit null (même si je doute que ça ait un intérêt quelconque) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static void main(String[] args) {
       Socket socket = new Socket();
       socket = close(socket);
       // ici, je voudrait que l'appelé (la fonction close()) ait mis automatiquement la variable socket à null
    }
     
    public static void close(Socket s) {
       s.close();
       return null;
    }
    Petite chose aussi, même si c'était qu'un code d'exemple tu aurais pu respecter les règles pour une méthode main en Java à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void main(String[] args)
    Il n'existe aucune autre façon valide d'écrire un main en Java. Même chose pour le mot-clé delete qui n'existe pas en Java (et pour cause, c'est un langage avec GC où il est impossible de gérer manuellement la mémoire). Tu n'aurais pas un peu confondu avec du C++ ?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    L'exemple est mauvais bien entendu. Il n'y a pas besoin de modifier "le pointeur" pour juste appeler close(). Et il n'y a presque jamais de raison d'assigner null à la place d'un objet existant. Il vaut mieux laisser se terminer le scope de la variable, ce qui conduit à sa destruction.

    Mais dans d'autres exemples, dans lesquels on a vraiment besoin de faire un changement "comme les pointeurs en C," voici une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class SocketContext {
      Socket socket;
      SocketContext() {
        socket = new Socket();
      }
      void close() {
        socket.close();
        socket = null;
      }
    }
     
    class AutreChose {
     
      void main()
      {
        SocketContext socketContext = new SocketContext();
        close(socketContext);
      }
     
      void close(SocketContext socketContext )
      {
        socketContext.close();
      }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par -Dici- Voir le message
    Pour être précis tu ne cherches pas à modifier la valeur de l'objet mais la valeur d'un pointeur sur l'objet. En Java, tout est référence donc lors du passage en paramètre un nouveau pointeur sur la même zone mémoire est créé, mais il s'agit bien de deux pointeurs indépendants...
    et donc impossible de créer/passer un paramètre qui soit l'adresse de la référence (que l'on pourrait déréférencer dans la fonction appelée) ? Je ne suis même pas sûr que la notion de déréférencement existe en Java.

    Citation Envoyé par -Dici- Voir le message
    Tu peux faire comme ça si tu tiens vraiment à ce que ça soit null (même si je doute que ça ait un intérêt quelconque) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static void main(String[] args) {
       Socket socket = new Socket();
       socket = close(socket);
       // ici, je voudrait que l'appelé (la fonction close()) ait mis automatiquement la variable socket à null
    }
     
    public static void close(Socket s) {
       s.close();
       return null;
    }
    Je retiens cette méthode mais rien ne garantit que le développeur fera socket = close(socket); et pas close(socket);
    Citation Envoyé par -Dici- Voir le message
    Petite chose aussi, même si c'était qu'un code d'exemple tu aurais pu respecter les règles pour une méthode main en Java à savoir [CODE]public static void main(String[] args)
    Oui, je sais mais ce n'était pas l'objet du propos donc j'ai fait "simple"

    Citation Envoyé par -Dici- Voir le message
    Même chose pour le mot-clé delete qui n'existe pas en Java (et pour cause, c'est un langage avec GC où il est impossible de gérer manuellement la mémoire). Tu n'aurais pas un peu confondu avec du C++ ?
    Je viens du C++, c'est pour cela que j'ai certains "automatismes" qui peuvent "surprendre" en Java

    Citation Envoyé par thelvin Voir le message
    Et il n'y a presque jamais de raison d'assigner null à la place d'un objet existant. Il vaut mieux laisser se terminer le scope de la variable, ce qui conduit à sa destruction.
    OK, message reçu !!!

    Merci à tous les 2 pour vos réponses
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Je retiens cette méthode mais rien ne garantit que le développeur fera socket = close(socket); et pas close(socket);
    Non et en quoi est-ce un problème? Si un ensemble de variables sont liées entre elle au point que la méthode doit impérativement les modifier, alors tout ça devrait se trouver dans un même objet L'appelant est libre de faire ce qu'il veux, c'est pas à toi de lui imposer quoi que ce soit.

Discussions similaires

  1. Réponses: 13
    Dernier message: 21/04/2011, 20h15
  2. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  3. Réponses: 8
    Dernier message: 06/04/2006, 18h45
  4. Apelle d une fonction js avec la valeur d'une listbox
    Par echecetmat dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/02/2005, 16h53
  5. Réponses: 5
    Dernier message: 25/11/2003, 10h02

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