[java] fonctions et variables

Naya -  
 Naya -
Bonjour,

Voila mon probleme. Je traduit en Java une librairie C++.

J'ai une fonction du type

void maFonction (type1 var1, type2 var2 )

en C++ si je faisai void maFonction (type1 var1, type2 & var2 ) ca me permet de modifier directement var2 et que ca soit effectif dans la fonction qui appel maFonction. en java, je ne vois pas comment faire pour que ca soit pareil.

j'espere etre assez claire, si ce n'est pas le cas n'hesitez pas a me demander ^^

merci d'avance

Naya
A voir également:

2 réponses

sendoshi Messages postés 22 Statut Membre 70
 
Ca dépends. Si type2 est un objet, alors le passage se fait directement par référence, en conséquence de quoi une modificatin faite sur var2 affecte directement l'objet original.
Pas de soucis donc, il suffit de
void maFonction(type1 var1, type2 var2)

attention c'est aussi valable pour var1: si c'est un objet, il sera passé doffice par référence, donc si tu veux pouvoir bosser dessus sans le modifier commence ton code par
type1 tempVar1= var1.clone(); //si tu as overridé la méthode clone
ou
type1 tempVar1= new Type1(var1);//si tu as un constructeur de copie

Voilà, bonne continuation
2
Naya
 
c'est ce qu'il me semblait que pour les objets c'etait bon, or j'ai la fonction suivante par exemple

protected void get_value (String key , String value)
{
value = m_values.get(key);
}

or String est bien un objet, n'est ce pas ? quand je veux afficher value ca me met null

(par contre je viens de verifier sur une autre de mes fonction avec des objets que j'ai cree et ca fonctionne comme tu dis)

je suis perplexe o_O
0
sendoshi Messages postés 22 Statut Membre 70 > Naya
 
ce que tu me décrit ressemble à unne Map:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html
0
Naya > sendoshi Messages postés 22 Statut Membre
 
en effet je cherche dans une map, mais c'est bien la valeur de value que j'avais besoin. mais avec ta methode ca marche. encore merci
0
Naya
 
est ce que si la fonction est definie en static ca ne passe plus en reference ?

pour ma fonction
static public ers.severity parse (String string, ers.severity s)

et que je l'appelle

parse(string, type);

type est a null apres alors que dans la fonction (en mode debuggeur) le s a bien une valeur...

quelqu'un voit il ou je me plante ?
merci
0
sendoshi Messages postés 22 Statut Membre 70 > Naya
 
static ne change rien au passage par références, ça change juste le fait que ta méthode devient une méthode de classe au lieu d'être une méthode d'instance. Maintenant, c'est peut être une connerie grosse comme une maison que je vais écrire, mais: est ce que quand tu passes s pour la première fois il ne serait pas null? exemple:

ers.severity type=null;
parse (string, type);

dans ce cas, tu cherche à affecter une valeur à une référence nulle, c'est comme si, en C/C++ tu passais comme paramètre un pointeur initialisé à null: tu affecte une une valeur dans une case mémoire qui n'est connue nulle part. Rapelles toi: en java, tout ce qu'on passe comme paramètre, dès qu'il s'agit d'objets, ce sont des copies des références. Et en utilisant ces références on travaille sur le contenu de l'adresse mémoire référencée. Donc suµi la reférence est nulle, impossible de propager le changement hors de ta méthode.

Si c'est autre chose qui fait bugger ton code, sans plus de détails, j'ai pas d'idées.
0
freto Messages postés 1543 Date d'inscription   Statut Membre Dernière intervention   162
 
Ben je crois que tu n'a rien à faire.....il me semble que si tu passe une variable à une fonction en java, elle peut etre modifiée et récupérée à l'extérieur de la dite fonction.
Sinon, si cela ne fonctionne pas, et pour etre plus sur, tu indique à ta fonction qu'elle retourne le type de variable. Ca donnerai ceci...

type2 maFonction (type1 var1, type2 var2 ){
//le code de ta fonction
//et quelque part
return var2;
}
0
Naya
 
merci pour ta reponse rapide

et bien je croyais aussi que je n'avais rien a faire car en java tout etait reference, or en fait on m'a explique que de base java passe une copie de la variable dans la fonction.

pour ce qui est de ta seconde solution elle marche pr le cas que j'ai montré en effet, mais si j'ai

int maFonction (type1 var1, type2 var2 ) et que je veux toujours modifié var2 ET avoir un int en sortie par exemple ca ne fonctionne (c'est le cas que j'ai en fait, je suis une nouille et j'aurais du le montrer direct :p)
0
sendoshi Messages postés 22 Statut Membre 70 > Naya
 
java fait du passage par copie uniquement si tu travaille sur des primitives (int, long etc...) ou si tu travaille sur des immutable (c'est le cas de String et je pense que c'est aussi le cas de Integer, Long etc, à vérifier)
0
Naya > sendoshi Messages postés 22 Statut Membre
 
oki tu viens de repondre a une partie de ma question

et donc si c'est un type String, comment puis je faire pour qu'il soit quand meme modifié ?
0
sendoshi Messages postés 22 Statut Membre 70 > Naya
 
tu peux passer par un StringBuffer ou un StringBuilder qui ont la même fonction mais sont mutables, l'appel de ta méthode maFonction devrait alors être
StringBuffer mySB= new StringBuffer(myString);
int resultat= maFonction(var1, mySB);
myString= mySB.toString();

je sais, c'est vachement bricolage...

mais je vois pas trop comment faire d'autre. Ca peut aussi marcher avec un stringBuilder, ou un char[].
Avec un String[] aussi.

Maintenant, si la String est une variable d'instance, rien ne t'empèche de passer this en paramètre de ta méthode et de modifier directement la string via son setter
0
Naya > sendoshi Messages postés 22 Statut Membre
 
super !!
ca marche nickel

merci beaucoup pour toutes les explications :)

bonne journee

Naya
0