Les pointeurs en Java - Java - Programmation
Marsh Posté le 10-03-2006 à 21:02:55
ça fait plaisir de voir que tu n'as pas été plus loin que 'int i = 2; i = 4 * 3;' dans ton apprentissage du java ...
Marsh Posté le 10-03-2006 à 21:03:03
Beh heu... C'est un peu le contraire. Les pointeurs n'apparaissent pas tels quels, à mon eternel regret, mais tu peux considérer qu'ils sont bien là.
Si tu passes un object à une méthode, ce dernier sera modifiable par la méthode (sauf cas immutables).
Marsh Posté le 10-03-2006 à 21:10:33
Merci, j ai pas encore fais un seul programme je me suis contenté de lire et j ai pas encore fini.
Marsh Posté le 10-03-2006 à 21:12:04
Par contre, ce qui a dégagé, c'est l'arithmétique de pointeur, et ça, bon vent
Marsh Posté le 10-03-2006 à 23:58:32
Mouais ... Le fait que java ne te permette pas de faire joujou avec les pointeurs ... moi je dis que c'est pas plus mal .. ça te permet de te concentrer sur des trucs plus importants que de faire joujou avec les trucs de bas niveau .. Apres niveau perf y a des pertes c'est sur ... mais avec les vm actuelles ... bof ... c'est plus aussi tragique que ça a peu l'etre auparavant ..
Marsh Posté le 11-03-2006 à 18:40:52
mais qu'est ce qu'on en a à faire des pointeurs enfin ! au contraire tu devrais etre content, t'auras plus à te faire chier avec l'alloc/désalloc, l'arithmétique de pointeur, et tout ! si vraiment tu n'arrives pas à faire sans pointeur (gage assuré de mauvaises pratiques de programmation), alors apprend le C# qui te permet d'utiliser des pointeurs en mode unsafe.
mais bon...
Marsh Posté le 11-03-2006 à 18:54:13
sircam a écrit : Beh heu... C'est un peu le contraire. Les pointeurs n'apparaissent pas tels quels, à mon eternel regret. |
Tu peux expliquer pourquoi tu regrettes que tout soit passé par référence dans la majorité des langages modernes
Marsh Posté le 11-03-2006 à 18:57:09
<bk> les pointeurs proviennent de l'esprit tortueux du malin, qui a décidé que la programmation n'était pas assez compliquée et qu'il fallait un truc en plus pour faire chier le pauvre pisseur de code programmeur </bk>
Marsh Posté le 11-03-2006 à 19:01:39
Je programme en c++ j utilise delete pour les pointeurs j avais pas envi d apprendre a malloc, et moi j aime bien ce qui est compliquer, en plus ils sont super utile les pointeurs en C je me demande comment on fai pour vivre sans.
Marsh Posté le 11-03-2006 à 19:03:41
Réfléchis une dizaine de secondes au rôle des pointeurs en C/C++, réfléchis 10s de plus pour savoir comment s'en débarasser (hint: le C++ avait commencé, mais au final l'implémentation de la solution était pire que le problème).
Si ça te suffit pas pour trouver... arrête tout de suite
Marsh Posté le 11-03-2006 à 19:08:07
ah oui, c'est sur, tu préferes utiliser delete que malloc()... sauf que l'équivalent C de delete, c'est free(). en C++, malloc() est encapsulé dans new. bon, pas grave...
et pour ton info, en C++, on a tendance à ne plus trop utiliser les pointeurs, au profit des références. références qui sont en fait implémentées en natif dans tout langage moderne. en Java, chaque variable (ou presque, j'omets les types natifs) est une référence. il en est de même en C# ou autre
juste une question : que fais tu en C++ qui ne pourrait être réalisé sans pointeur ?
Marsh Posté le 11-03-2006 à 19:12:40
masklinn a écrit : Réfléchis une dizaine de secondes au rôle des pointeurs en C/C++, réfléchis 10s de plus pour savoir comment s'en débarasser (hint: le C++ avait commencé, mais au final l'implémentation de la solution était pire que le problème). |
Quelle est la solution que le C++ a essayé d'implémenter ? Je suis curieux la ...
Et en quoi est-ce qu'elle était pire ?
Marsh Posté le 11-03-2006 à 19:14:18
++fab a écrit : Quelle est la solution que le C++ a essayé d'implémenter ? Je suis curieux la ... |
Les références
++fab a écrit : Et en quoi est-ce qu'elle était pire ? |
Parce qu'on se retrouve avec tout un bordel et une syntaxe à la con, au lieu d'avoir une hydre à une tête on a une hydre à deux têtes
Et que les références C++ sont moins puissantes/pratiques que les pointeurs C pour un certain nombre d'utilisations (genre récupérer une référence sur une fonction )
Marsh Posté le 11-03-2006 à 19:33:22
masklinn a écrit : Les références |
Ce n'est pas une solution de remplacement. C'est une solution parfois alternative seulement. Gardes aussi à l'esprit que la compatibilité avec C doit être "aussi bonne que possible".
Citation : Parce qu'on se retrouve avec tout un bordel et une syntaxe à la con, au lieu d'avoir une hydre à une tête on a une hydre à deux têtes |
Le truc, c'est que les références nulles, ça n'existe pas en C++ (sauf si c'est machiavel qui code) ...
Après, je te retourne l'histoire de l'hydre : en C++, les types user-defined et fondamentaux sont utilisables de la même manière, en Java non, les uns passent par référence, les autres par valeur. Qui a deux têtes dans l'histoire ?
Citation : Et que les références C++ sont moins puissantes/pratiques que les pointeurs C pour un certain nombre d'utilisations (genre récupérer une référence sur une fonction ) |
Oui, je vois ce que tu veux dire. Même si ton exemple me parait un peu vague, je pense que par fonction, tu voulais dire rvalue.
Marsh Posté le 11-03-2006 à 19:41:54
++fab a écrit : |
non mais ça c'est une connerie monumentale de Java d'avoir laissé des types primitifs
C# roulaize pour ça, il n'y a pas de types primitifs (ils sont boxés automatiquement, ou ce sont des alias, les avis divergent à ce sujet)
Marsh Posté le 11-03-2006 à 19:45:36
++fab a écrit :
|
Hum, non, le seul truc passé par recopie (par valeur) en Java ce sont les "primitive types", qui en plus d'être lourdement (et de plus en plus) critiqués ne sont pas des objets, et ne forme qu'une partie des built-ins Java.
La dychotomie passage par référence/valeur en Java est parallèle à la dychotomie "primitive types"/objects
Après, Java le langage (pour le séparer de Java la plateforme, Java la VM, ...) est imo un langage pourri, donc bon...
++fab a écrit : Oui, je vois ce que tu veux dire. Même si ton exemple me parait un peu vague, je pense que par fonction, tu voulais dire rvalue. |
Non, je voulais bel et bien dire fonction, prendre une fonction et la trimballer en tant qu'argument d'autres fonctions
Marsh Posté le 11-03-2006 à 19:51:11
masklinn a écrit : Hum, non, le seul truc passé par recopie (par valeur) en Java ce sont les "primitive types", qui en plus d'être lourdement (et de plus en plus) critiqués ne sont pas des objets, et ne forme qu'une partie des built-ins Java. |
Oui, c'est ce que je voulais dire, désolé si je ne connais pas le vocabulaire Java
Citation : La dychotomie passage par référence/valeur en Java est parallèle à la dychotomie "primitive types"/objects |
On est d'accord.
Citation : Après, Java le langage (pour le séparer de Java la plateforme, Java la VM, ...) est imo un langage pourri, donc bon... |
C'est pas moi qui l'ai dit !
Citation : Non, je voulais bel et bien dire fonction, prendre une fonction et la trimballer en tant qu'argument d'autres fonctions |
Bon, alors je ne vois pas le problème, mais ce n'est peut-être pas très grave
Marsh Posté le 11-03-2006 à 21:38:36
J'ai pas tout lu mias, je trouve aussi que les référence c'est pas tres bien, j'ai souvent des problemes qu'en je veux m'en servir, et je peux refaire tout mes programmes sans pointeurs mais ce sera moins bien.
Marsh Posté le 11-03-2006 à 21:43:27
Ok lol, quand tu auras des exemples de limitations liés à l'utilisation de références et non de pointeurs en Java, C#, Python, Ruby, Lisp, Smalltalk tu nous en fais part ok?
Marsh Posté le 11-03-2006 à 21:52:11
J'ai pas dit que les reference nous limitais mais que c'etait plus chiant que les pointeurs, ce n'est que mon avis rien d'autre.
Marsh Posté le 11-03-2006 à 22:00:00
Mais en quoi c'est plus chiant nom de dieu
Donne des exemples
Marsh Posté le 11-03-2006 à 22:04:28
masklinn a écrit : Hum, non, le seul truc passé par recopie (par valeur) en Java ce sont les "primitive types", qui en plus d'être lourdement (et de plus en plus) critiqués ne sont pas des objets, et ne forme qu'une partie des built-ins Java. |
Tant qu'à continuer dans l'enculage de mouche sur ce beau topic, en Java tout les passages se font par valeur.
Sun> In Java methods, arguments are passed by value. When invoked, the method receives the value of the variable passed in. When the argument is of primitive type, pass-by-value means that the method cannot change its value. When the argument is of reference type, pass-by-value means that the method cannot change the object reference, but can invoke the object's methods and modify the accessible variables within the object.
Marsh Posté le 11-03-2006 à 22:06:33
ReplyMarsh Posté le 11-03-2006 à 22:13:31
Bein en l'occurence en Java si, parceque qu'une référence en Java c'est un "pointeur".
Sun>The reference values (often just references) are pointers to these
objects, and a special null reference, which refers to no object.
C++> A reference shall be initialized to refer to a valid object or
function. [Note: in particular, a null reference cannot exist in a
well-defined program, because the only way to create such a
reference would be to bind it to the "object" obtained by
dereferencing a null pointer, which causes undefined behavior.
Java reference != C++ reference
Marsh Posté le 11-03-2006 à 22:14:59
Je parlait pour le c++ et je ne parle presque pas anglais, je commence tout juste le java.
Marsh Posté le 11-03-2006 à 22:16:12
push a écrit : Tant qu'à continuer dans l'enculage de mouche sur ce beau topic, en Java tout les passages sont font par valeur. |
J'veux la source, parce que la sémantique du pass-by-value, c'est que la fonction reçoit une copie de l'argument, en java quand on transmet autre chose qu'un type primitif il n'y a pas construction d'un nouvel objet, juste transmission de la référence vers un objet existant (si tous les objets étaient copiés le coût d'appel des fonctions serait prohibitif), donc la sémantique est bel et bien celle du pass-by-ref
T'étais tout seul sur le coup alors, tous les autres parlaient de références dans un langage basé dessus
Marsh Posté le 11-03-2006 à 22:34:47
masklinn a écrit : J'veux la source, parce que la sémantique du pass-by-value, c'est que la fonction reçoit une copie de l'argument, en java quand on transmet autre chose qu'un type primitif il n'y a pas construction d'un nouvel objet, juste transmission de la référence vers un objet existant (si tous les objets étaient copiés le coût d'appel des fonctions serait prohibitif), donc la sémantique est bel et bien celle du pass-by-ref |
Bein oui c'est ce qui est dit, sauf que c'est bien une référence à la java qui est passée par valeur et donc recopiée, le pass-by-ref sur une reference java n'a pas beaucoup de sens.
Marsh Posté le 11-03-2006 à 22:43:30
Mais bon je vois que certains parlent de pass-by-ref aussi dans ce cas, ça sent encore le conflit sémantique entres programmeurs Java/C++ tout ça, comme l'histoire des méthodes/fonctions.
Marsh Posté le 11-03-2006 à 22:44:59
masklinn a écrit : juste transmission de la référence |
c'est à dire une copie de la valeur binaire de la référence (le pointeur quoi, l'adresse mémoire de l'objet) sur la pile d'appel.
C'est ce qu'il veut dire quand il dit que tout les appels de méthode en java se font par copie des paramètres : dans tous les cas c'est une copie binaire du paramètre (qu'il soit type primitif ou référence).
Marsh Posté le 12-03-2006 à 00:12:54
masklinn a écrit : la sémantique est bel et bien celle du pass-by-ref |
niet, la variable représente une référence, et cette référence est copiée lors du passage, tu ne peux donc pas ré-affecter une variable locale dans une fonction appellée : passage par valeur.
Marsh Posté le 12-03-2006 à 00:52:56
nraynaud a écrit : niet, la variable représente une référence, et cette référence est copiée lors du passage, tu ne peux donc pas ré-affecter une variable locale dans une fonction appellée : passage par valeur. |
Modifier l'objet reçu en paramètre modifie l'objet local envoyé : pas passage par valeur
Marsh Posté le 12-03-2006 à 02:01:25
k, lol
k, lol
bon maintenant les arguments ?
edit: je parle des arguments qui viendront étayer tes affirmations, pas des arguments passés aux fonctions
Marsh Posté le 12-03-2006 à 02:11:47
kadreg a écrit : Par contre, ce qui a dégagé, c'est l'arithmétique de pointeur, et ça, bon vent |
z'entendez quoi par arithmetique du pointeur?
Harkonnen a écrit : <bk> les pointeurs proviennent de l'esprit tortueux du malin, qui a décidé que la programmation n'était pas assez compliquée et qu'il fallait un truc en plus pour faire chier le pauvre |
Marsh Posté le 12-03-2006 à 08:32:33
masklinn a écrit : Modifier l'objet reçu en paramètre modifie l'objet local envoyé : pas passage par valeur |
nan, parce que la partie "locale" c'est que la référence, le reste est sur le tas.
Le passage par référence te permet de modifier la frame locale de la pile d'appel, là c'est pas le cas.
Marsh Posté le 12-03-2006 à 09:21:26
En fait il y en a, mais t'as pas besoin de savoir qu'ils existent
Plus sérieusement si t'as fait du C++, tu devrai comprendre très vite comment ça marche. Sinon poste une question avec un exemple concret, car là on a l'impréssion (sans vouloir te froisser) que t'as juste la flemme d'apprendre (ce que je comprends tout à fait au passage ).
Marsh Posté le 12-03-2006 à 16:19:02
C'est pas que j'ai la flemme c'est que j'ai pas le temps, je me suis arreter quand ils disaient qu'il n'y avait pas de pointeur en Java,ce qui m'a surpris.
Marsh Posté le 12-03-2006 à 17:02:34
C'est toujours plus hype de faire du pointeur
Le passage aux pointeurs est souvent un moment délicat dans l'apprentissage du noob. C'est un peu comme un rituel d'intégration
"Passe ton Ada et ton C++ d'abord ! "
Marsh Posté le 10-03-2006 à 21:01:00
Voila je programme en C++ et je me suis mis au Java et je suis surpris qu il n y ait pas de pointeur, je voudrai savoir comment remplacer les pointeurs pour passer des objets a une fonction et que cette fonction les modifies.
Merci.