Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

renvoi de plusieurs paramètres sans pointeurs

20 réponses
Avatar
frandicz
Bonjour,

Ayant beaucoup programmé en C/C++, je suis en train de me mettre au
java. Etant donné qu'il n'existe pas de pointeurs, je me demande comment
on fait pour résoudre certains problèmes.

Comment fait une fonction pour renvoyer plusieurs paramètres ? En C++,
on passait un pointeurs vers des variables que la fonction devait
modifier. Par ex:

// fonction qui "renvoie" trois entiers
void ma_fonction(int *p1, int *p2, int *p3)
{
*p1 = 4;
*p2 = 5;
*p3 = 10;
}

Evidemment, on pourrait mettre des variables à retourner en global, ou
renvoyer une référence vers un objet qui contient les données, mais
c'est vraiment compliqué !

C'est le principal problème auquel j'ai pensé. Y-en a-t-il d'autres
importants, et quelles sont les remèdes ?

Merci.

10 réponses

1 2
Avatar
Marc Petit-Huguenin
frandicz wrote:
Bonjour,

Ayant beaucoup programmé en C/C++, je suis en train de me mettre au
java. Etant donné qu'il n'existe pas de pointeurs, je me demande comment
on fait pour résoudre certains problèmes.

Comment fait une fonction pour renvoyer plusieurs paramètres ? En C++,
on passait un pointeurs vers des variables que la fonction devait
modifier. Par ex:

// fonction qui "renvoie" trois entiers
void ma_fonction(int *p1, int *p2, int *p3)
{
*p1 = 4;
*p2 = 5;
*p3 = 10;
}

Evidemment, on pourrait mettre des variables à retourner en global, ou
renvoyer une référence vers un objet qui contient les données, mais
c'est vraiment compliqué !

C'est le principal problème auquel j'ai pensé. Y-en a-t-il d'autres
importants, et quelles sont les remèdes ?


La solution, c'est evidemment de programmer objet[1]. Essayer d'appliquer
des techniques non-objet a un language objet ne peux qu'amener a ce genre
de problemes. Toute methode non statique a une reference vers un objet qui
peut contenir ces variables.

Ceci dit il y a un cas et un seul que j'ai rencontre pour lequel un passage
par reference serait utile: C'est le cas ou une variable est utilisee par
une anonymous class. Exemple:

// Ne compile pas parceque la variable a doit etre final
final Object lock = new Object();
boolean a = false;
synchronized (lock) {
new Thread() {
public void run() {
synchronized (lock) {
lock.notify();
a = true;
}
}.start();
}
while (!a) {
lock.wait();
}
}

La solution que j'utilise, tres laide, est la suivante:

boolean[] a = new boolean[1];
synchronized (a) {
new Thread() {
public void run() {
a.notify();
a[0] = true;
}
}.start();
while (!a[0]) {
a.wait();
}
}


D'ailleurs si quelqu'un a quelque chose de mieux a offrir, je suis preneur.



[1] Programmer objet, pas programmer oriente objet comme en C++. La
programmation orientee objet est a la programmation objet ce que le steak
de soja est a la cote de boeuf.

Avatar
Marc Petit-Huguenin
frandicz wrote:
Bonjour,

Ayant beaucoup programmé en C/C++, je suis en train de me mettre au
java. Etant donné qu'il n'existe pas de pointeurs, je me demande comment
on fait pour résoudre certains problèmes.

Comment fait une fonction pour renvoyer plusieurs paramètres ? En C++,
on passait un pointeurs vers des variables que la fonction devait
modifier. Par ex:

// fonction qui "renvoie" trois entiers
void ma_fonction(int *p1, int *p2, int *p3)
{
*p1 = 4;
*p2 = 5;
*p3 = 10;
}

Evidemment, on pourrait mettre des variables à retourner en global, ou
renvoyer une référence vers un objet qui contient les données, mais
c'est vraiment compliqué !

C'est le principal problème auquel j'ai pensé. Y-en a-t-il d'autres
importants, et quelles sont les remèdes ?


La solution, c'est evidemment de programmer objet[1]. Essayer d'appliquer
des techniques non-objet a un language objet ne peux qu'amener a ce genre
de problemes. Toute methode non statique a une reference vers un objet qui
peut contenir ces variables.

Ceci dit il y a un cas et un seul que j'ai rencontre pour lequel un passage
par reference serait utile: C'est le cas ou une variable est utilisee par
une anonymous class. Exemple:

// Ne compile pas parceque la variable a doit etre final
final Object lock = new Object();
boolean a = false;
synchronized (lock) {
new Thread() {
public void run() {
synchronized (lock) {
lock.notify();
a = true;
}
}.start();
}
while (!a) {
lock.wait();
}
}

La solution que j'utilise, tres laide, est la suivante:

final boolean[] a = new boolean[1];
synchronized (a) {
new Thread() {
public void run() {
synchronized (a) {
a.notify();
a[0] = true;
}
}
}.start();
while (!a[0]) {
a.wait();
}
}

D'ailleurs si quelqu'un a quelque chose de mieux a offrir, je suis preneur.



[1] Programmer objet, pas programmer oriente objet comme en C++. La
programmation orientee objet est a la programmation objet ce que le steak
de soja est a la cote de boeuf.

Avatar
Thomas Cornet
La solution la plus simple qui me vient à l'esprti est que ta méthode
retourne un tableau d'entier

int[] ta_fonction(...)
{
int[] res = ....

return res;
}



Bonjour,

Ayant beaucoup programmé en C/C++, je suis en train de me mettre au
java. Etant donné qu'il n'existe pas de pointeurs, je me demande comment
on fait pour résoudre certains problèmes.

Comment fait une fonction pour renvoyer plusieurs paramètres ? En C++,
on passait un pointeurs vers des variables que la fonction devait
modifier. Par ex:

// fonction qui "renvoie" trois entiers
void ma_fonction(int *p1, int *p2, int *p3)
{
*p1 = 4;
*p2 = 5;
*p3 = 10;
}

Evidemment, on pourrait mettre des variables à retourner en global, ou
renvoyer une référence vers un objet qui contient les données, mais
c'est vraiment compliqué !

C'est le principal problème auquel j'ai pensé. Y-en a-t-il d'autres
importants, et quelles sont les remèdes ?

Merci.


Avatar
Laurent Bossavit
Evidemment, on pourrait mettre des variables à retourner en global, ou


Pas en Java, la notion de portée globale n'y existe pas.

renvoyer une référence vers un objet qui contient les données, mais


C'est la meilleure solution. S'il faut renvoyer les trois valeurs
ensemble, c'est qu'elles ont une bonne raison d'aller ensemble; en
programmation objet, quand des données ont une bonne raison d'aller
ensemble, on en fait une classe.

c'est vraiment compliqué !


Non, c'est assez simple. Ce qui est compliqué, c'est de faire évoluer
des programmes mal écrits. Un programme en langage Java qu'on a essayé
d'écrire comme si on était en C/C++ sera probablement mal écrit, comme
de l'anglais "mon tailleur is riche".

Laurent

Avatar
Cédric Chabanois
En fait, c'est rare que cela pose problème. Les paramètres renvoyés par
une fonction sont souvent liés fonctionnellement et donc renvoyer un
objet contenant les données ne choque pas, au contraire.

Le seul problème que cela pose est lorsqu'il faut interagir avec
d'autres systèmes. Avec les services webs par exemple, il y a des objets
IntHolder, FloatHolder, StringHolder etc ... qui ne sont que des
wrappers autour des types simples, ce qui donne dans ton cas :
void maFonction(IntHolder p1, IntHolder p2, IntHolder p3)


Cédric

Bonjour,

Ayant beaucoup programmé en C/C++, je suis en train de me mettre au
java. Etant donné qu'il n'existe pas de pointeurs, je me demande comment
on fait pour résoudre certains problèmes.

Comment fait une fonction pour renvoyer plusieurs paramètres ? En C++,
on passait un pointeurs vers des variables que la fonction devait
modifier. Par ex:

// fonction qui "renvoie" trois entiers
void ma_fonction(int *p1, int *p2, int *p3)
{
*p1 = 4;
*p2 = 5;
*p3 = 10;
}

Evidemment, on pourrait mettre des variables à retourner en global, ou
renvoyer une référence vers un objet qui contient les données, mais
c'est vraiment compliqué !

C'est le principal problème auquel j'ai pensé. Y-en a-t-il d'autres
importants, et quelles sont les remèdes ?

Merci.


Avatar
Bruno Jouhier
Une des solutions classique consiste à passer un tableau à un seul élément:

int [] p1 = new int[1];
int [] p2 = new int[1];
int [] p3 = new int[1];

ma_fonction(p1, p2, p3);

ou alors, tu peux introduire une classe ayant p1, p2, p3 pour membres et
passer une instance de cette classe, ou bien coder ta méthode pour qu'elle
alloue une instance de cette classe pour retourner les 3 infos d'un coup.

Ce qui est pratique en Java, c'est que tu n'as pas à te préoccuper de la
libération de ces objets intermédiaires.

Si ça te pose vraiment problème, tu peux regarder le langage C#. C'est comme
Java mais il y a des mots clés "ref" et "out" (et "struct" aussi) qui te
donnent une plus grande flexibilité (mais qui rendent aussi le langage un
peu plus complexe!).

Bruno.

"frandicz" a écrit dans le message de news:
41c4b978$0$6550$
Bonjour,

Ayant beaucoup programmé en C/C++, je suis en train de me mettre au java.
Etant donné qu'il n'existe pas de pointeurs, je me demande comment on fait
pour résoudre certains problèmes.

Comment fait une fonction pour renvoyer plusieurs paramètres ? En C++, on
passait un pointeurs vers des variables que la fonction devait modifier.
Par ex:

// fonction qui "renvoie" trois entiers
void ma_fonction(int *p1, int *p2, int *p3)
{
*p1 = 4;
*p2 = 5;
*p3 = 10;
}

Evidemment, on pourrait mettre des variables à retourner en global, ou
renvoyer une référence vers un objet qui contient les données, mais c'est
vraiment compliqué !

C'est le principal problème auquel j'ai pensé. Y-en a-t-il d'autres
importants, et quelles sont les remèdes ?

Merci.


Avatar
Bruno Jouhier
[1] Programmer objet, pas programmer oriente objet comme en C++. La
programmation orientee objet est a la programmation objet ce que le steak
de soja est a la cote de boeuf.


Smalltalk, Eiffel, c'est du steak de soja?

Vous avez un papier qui explique un peu la différence, ou c'est juste du
troll sans intérêt?

Bruno.

Avatar
Marc Petit-Huguenin
Bruno Jouhier wrote:
[1] Programmer objet, pas programmer oriente objet comme en C++. La
programmation orientee objet est a la programmation objet ce que le steak
de soja est a la cote de boeuf.



Smalltalk, Eiffel, c'est du steak de soja?


Non, smalltalk et eiffel, c'est de la programmation objet. Je parlais de C++.


Vous avez un papier qui explique un peu la différence, ou c'est juste du
troll sans intérêt?


Si tu pense que c'est un troll, alors pourquoi repondre?


Bruno.





Avatar
euler
Bruno Jouhier wrote:

Une des solutions classique consiste à passer un tableau à un seul
élément:

int [] p1 = new int[1];
int [] p2 = new int[1];
int [] p3 = new int[1];

ma_fonction(p1, p2, p3);



euh, quitte à bricoler, pourquoi ne pas passer directement des Integer ? en
plus avec java 5 y'a même l'autoboxing pour donner un coup de main !


ou alors, tu peux introduire une classe ayant p1, p2, p3 pour membres et
passer une instance de cette classe, ou bien coder ta méthode pour qu'elle
alloue une instance de cette classe pour retourner les 3 infos d'un coup.

Ce qui est pratique en Java, c'est que tu n'as pas à te préoccuper de la
libération de ces objets intermédiaires.

Si ça te pose vraiment problème, tu peux regarder le langage C#.


restons polis s.v.p :-D


[...]

Avatar
Marc Petit-Huguenin
euler wrote:
Bruno Jouhier wrote:


Une des solutions classique consiste à passer un tableau à un seul
élément:

int [] p1 = new int[1];
int [] p2 = new int[1];
int [] p3 = new int[1];

ma_fonction(p1, p2, p3);




euh, quitte à bricoler, pourquoi ne pas passer directement des Integer ? en
plus avec java 5 y'a même l'autoboxing pour donner un coup de main !


Les Integer sont immutables, donc ca ne change pas le probleme.



ou alors, tu peux introduire une classe ayant p1, p2, p3 pour membres et
passer une instance de cette classe, ou bien coder ta méthode pour qu'elle
alloue une instance de cette classe pour retourner les 3 infos d'un coup.

Ce qui est pratique en Java, c'est que tu n'as pas à te préoccuper de la
libération de ces objets intermédiaires.

Si ça te pose vraiment problème, tu peux regarder le langage C#.



restons polis s.v.p :-D


[...]



1 2