Téléchargement
illégal
Posez votre question Signaler

Passer un entier par adresse en JAVA [Résolu]

Mr Debutant - Dernière réponse le 14 mars 2012 à 16:10
Salut à tous !

Wouala ... la question me semble super bidon ... n'empeche que j'coince !

Lors d'un appel à une méthode, je veux changer la valeur d'un entier ... ce qui se ferait en C par un passage par adresse.

Donc là j'utilise l'objet Integer (puisque les objets sont passés par référence), le hic c'est que j'trouve pas de méthode qui modifie la valeur d'un Integer ...
y a que des affectations du genre :
monInteger = new Integer( 10 ) ;

Mais ca ca marche pas puisque ca change la référence de l'objet et pas la valeur de l'entier...

Z'auriez une solution ???


Merci d'avance a tous !!

Bonne fetes :)
Lire la suite 

Passer un entier par adresse en JAVA »

12 réponses
Réponse
+1
moins plus
Hello, nouvel Essai (un peu tordu) ???

public class Essai
{
private Integer j;

public Essai()
{
j = new Integer(0);
}

public static void main (String args[])
{
Essai essai = new Essai();
essai.appelante();
}

public void testPassage(Integer i)
{
System.out.println("Avant modification " +i.toString());
j = i.valueOf("100");
System.out.println("Apres testPassage " + getJ().toString());
}
public void appelante()
{
Integer nb = new Integer(20);
testPassage(nb);
System.out.println("Apres testPassage " + j.toString());
}

public Integer getJ()
{
return j;
}

}
jo - 2 avril 2008 à 15:38
J'arrive un peu tard ;), mais bon, ça peut toujours aider...
Voici ce que j'ai compris:
Les types primitifs (int, float, etc.: qui commencent par une minuscule) sont passés par valeur.
Les types complexes (tous les autres, tous les objets) sont passés par référence MAIS certains d'entre eux sont IMMUTABLES (tous les wrappers: Integer, Float, etc. + String + ?), autrement dit, lorsqu'ils sont modifiés, une nouvelle zone mémoire est créée...
Conséquence: lorsque l'on passe un type immutable comme paramètre à une méthode, on passe la référence, mais dès la 1ère modification, une autre zone est créée, donc dans la méthode appelante, le paramètre n'est pas mis à jour!
Solution: créer une classe qui encapsule le type primitif ou le wrapper.
C'est clair?
Ajouter un commentaire
Réponse
+0
moins plus
Bonsoir,
Ne serais-tu pas en train de confondre le type numérique int et la classe Integer qui est la classe Wrapper du type numérique int?
Ajouter un commentaire
Réponse
+0
moins plus
Nan nan j'utilise bien un objet de type Integer comme argument pourtant ...
En gros, voilà un exemple simplifié de ce que j'voudrais faire :

public void test( Integer paramInteger) {
paramInteger = new Integer( valeurCalculee);
// ou qq choz ds ce gout la pour recupere une valeur dans paramInteger ...
}

public void methodeAppelante( ) {
Integer monInteger;

test(monInteger);
// ici monInteger a la valeur calculee dans la methode test
}


Remarque : tt en sachant que ma methode "test" renvoie en fait deja un objet et c'est pour ca que j'renvoie pas directement l'Integer

Merci de vouloir m'aider philtrain en tt cas :o)
Ajouter un commentaire
Réponse
+0
moins plus
re,
Je ne comprend pas trop ta démarche...
Pourquoi vouloir changer la valeur d'un entier en passant par un Wrapper?
paramInteger = new Integer(valeurCalculee); construit un nouvel objet de type Integer qui représente l'entier valeurCalculee
la méthode test ne renvoie rien du tout, elle est de type void.
Ajouter un commentaire
Réponse
+0
moins plus
Heu vi vi test est de type void mais c'etait pour simplifier (finalement j'vois que ca ne brouille les cartes plus qu'autre chose !! :o)

La veritable méthode que j'ai codée renvoie un objet, c'est ce que je voulais dire ...
Ma demarche en C s'implementerai de cette facon :
float test( int *paramAmodifier) {
float reel;

*paramAmodifier = valeurEntiereCalculee;
reel = valeurReelleCalculee ;

return valeurReelle;
}


En gros ma méthode renvoie deja un objet ; mais j'ai également besoin en sortie de ce fameux entier ...

J'espere avoir ete clair :o/
Merci encore une fois !
Ajouter un commentaire
Réponse
+0
moins plus
Ben alors, pour récupérer la valeur de l'enveloppeur sous forme d'un entier, il suffit de faire:
int monEntier = monInteger.intValue();
non?
Ajouter un commentaire
Réponse
+0
moins plus
Vi vi ca j'suis d'accord, mais en fait j'sais pas modifier la valeur contenue dans le wrapper qd j'suis dans la méthode ...

Voilà le code java qui révèle mon problème :
public void testPassage(Integer nb) {
System.out.println("Avant modification " + nb.toString());
nb = nb.valueOf("100");
System.out.println("Apres modification " + nb.toString()); s
}

public void appelante() {
Integer nb = new Integer(20);

testPassage(nb);
System.out.println("Apres testPassage " + nb.toString());
}

Ca ca me donne :
Avant modification : 20
Apres modification : 100
Apres testPassage : 20

Tu vois mon probleme se situe au niveau de la ligne :
nb = nb.valueOf("100");

Qu'est-ce que j'pourrais faire pour réellement modifier la valeur qui est dans l'Integer nb, pour qu'en sortie de la méthode, j'récupère bien 100 ici ?

Merci en tt cas de te donner tt ce mal !
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Est-ce que ceci peut t'aider ?:

public class Essai
{
public static void main (String args[])
{
Essai essai = new Essai();
essai.appelante();
}

public Integer testPassage(Integer i)
{
System.out.println("Avant modification " +i.toString());
i = i.valueOf("100");
System.out.println("Apres testPassage " + i.toString());
return i;
}
public void appelante()
{
Integer nb = new Integer(20);
nb = testPassage(nb);
System.out.println("Apres testPassage " + nb.toString());
}

}

a+
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour philtrain,

En fait dans mon véritable code, la méthode qui est représentée ici par testPassage( ), renvoie déjà qq chose ...
Du coup, je ne peux pas faire le :
return i;

C'est justement mon problème ... comment récupérer cette nouvelle valeur de i sans passer par un return ... :o/

Merci de te pencher sur la question :o)
Ajouter un commentaire
Réponse
+0
moins plus
Lis ceci, ça pourrait t'intéresser :

http://www.dimi.uniud.it/labs/documentazione/java/tips/Tip39.html

M.
Ajouter un commentaire
Réponse
+0
moins plus
Merci à jo (4 ans après) qui a su répondre à une de mes intérrogations
Ajouter un commentaire
Ce document intitulé « Passer un entier par adresse en JAVA » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?