Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2083 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Clonage d'objets RESOLU

n°205535
--greg--
Posté le 30-08-2002 à 12:46:10  profilanswer
 

Reprise du message précédent :
cherrytree tu me pretes ton penpad stp?
(c bien ça que tu voulais montrer nan? :o)
 
([:blueflag] btw)


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
mood
Publicité
Posté le 30-08-2002 à 12:46:10  profilanswer
 

n°205547
Cherrytree
cn=?
Posté le 30-08-2002 à 13:11:54  profilanswer
 

DarkLord a écrit a écrit :

je suis désolé je comprends rien.



je vais essayer de reprendre depuis le début.
Pouf pouf.
 
Alors voilà. Dans mon programme, il existe une ressource unique, qui ne doit pas être dupliquée, ni modifiée : c'est une liste de taches, implémentée sous la forme d'un objet TaskList, contenant list.size() objet de type Task.
 
J'ai un problème de placement de taches à résoudre. 2 processeurs sont susceptibles d'accepter les taches : le processeur 0 et le processeur 1. Pour des raisons des commodités, le processeur est codé par un entier : int value.
 
Mon programme lance plusieurs instances du Solver, un objet capable de résoudre le problème du placement des taches.
 
Pour résoudre mon problème, Solver attribue des valeurs 0 ou 1, correspondant à chaque processeur à chacune des taches. Il est nécessaire que ces valeurs soient propre à chaque Solver, sinon, tous les Solvers auront la même solution à me proposer.
 
Pour faciliter la représentation du problème, j'ai pris soin de développer une classe Data, qui associe la référence d'une tache à une valeur (value), que le Solver aura pour charge de modifier.
 
Chaque Solver modifie la value selon son bon vouloir (enfin presque), d'un Solver à l'autre, les seules choses qui diffèrent sont les value associées aux taches.
 
En résumé :
- Un Solver dispose d'un tableau d'objet Data, appelé datas.
- Chaque objet Data est formé de 2 variables : une référence à un objet Task et un entier propre à l'objet Data que l'on est en train de manipuler.
- Chaque Solver dispose d'un tableau similaire, avec le même nombre de Data, mais dont les champs value sont décorellé.


---------------
Le site de ma maman
n°205549
Cherrytree
cn=?
Posté le 30-08-2002 à 13:12:39  profilanswer
 

--greg-- a écrit a écrit :

cherrytree tu me pretes ton penpad stp?
(c bien ça que tu voulais montrer nan? :o)
 
([:blueflag] btw)



:o


---------------
Le site de ma maman
n°205559
darklord
You're welcome
Posté le 30-08-2002 à 13:21:08  profilanswer
 

je crois avoir compris. Lorsque tu clones Datas tu voudrais qu'il prenne certaine chose en référence et d'autre en copie. tu peux qd meme utiliser arraycopy je pense mais tu dois redéfinir la méthode clone dans l'objet Data pour qu'il copie ce que tu veux copier et qu'il prenne la référence de ce que tu ne veux pas cloner.
 
A+


---------------
Just because you feel good does not make you right
n°205563
Cherrytree
cn=?
Posté le 30-08-2002 à 13:24:00  profilanswer
 

DarkLord a écrit a écrit :

je crois avoir compris. Lorsque tu clones Datas tu voudrais qu'il prenne certaine chose en référence et d'autre en copie. tu peux qd meme utiliser arraycopy je pense mais tu dois redéfinir la méthode clone dans l'objet Data pour qu'il copie ce que tu veux copier et qu'il prenne la référence de ce que tu ne veux pas cloner.
 
A+



Donc on est bien d'accord que System.arrayCopy utilise la méthode clone de Data ! ! ! !  :fou: benou ! ! ! (c'est vrai ça, si on me dit des mensonges, je sais plus faire, moua ! [:ruisseau de larmes])
 
En effet, c'est bien ça, tu as compris : mon clonage doit prendre le champ value en copie et le champ Task en référence. :jap:


---------------
Le site de ma maman
n°205566
HappyHarry
Posté le 30-08-2002 à 13:25:37  profilanswer
 

Cherrytree a écrit a écrit :

Donc on est bien d'accord que System.arrayCopy utilise la méthode clone de Data ! ! ! !  :fou: benou ! ! ! (c'est vrai ça, si on me dit des mensonges, je sais plus faire, moua ! [:ruisseau de larmes])
 
En effet, c'est bien ça, tu as compris : mon clonage doit prendre le champ value en copie et le champ Task en référence. :jap:  




 
mais putain puisque je t'ai deja dit que les types de bases sont purement et simplement dupliqués ! c pas des références bourdel !!!  :fou:

n°205567
Cherrytree
cn=?
Posté le 30-08-2002 à 13:26:32  profilanswer
 

benou et DarkLord : vous êtes en désaccord là-dessus, si je comprends bien. benou ? Où es-tu ? Hou-hou !
 

Cherrytree a écrit a écrit :

Bon, ben je vais voir ça. System.arrayCopy fait appel à la méthode clone des éléments du tableaux, je suppose, non ?




non, ca copie un tableau de façon binaire (et de façon optimisée). <--- benou's contribution.


---------------
Le site de ma maman
n°205571
Cherrytree
cn=?
Posté le 30-08-2002 à 13:28:32  profilanswer
 

HappyHarry a écrit a écrit :

 
 
mais putain puisque je t'ai deja dit que les types de bases sont purement et simplement dupliqués ! c pas des références bourdel !!!  :fou:  



Je sais bien, mais le programme que j'ai écrit hier, il faisait vraiment des trucs dingues. Je vous l'envoie.


---------------
Le site de ma maman
n°205575
Cherrytree
cn=?
Posté le 30-08-2002 à 13:36:09  profilanswer
 

Ceci était un programme test, où Task task est remplacé par String name. C'est trop simple comme programme, mais ça montre quand on l'exécute les problèmes que j'ai eu et les questions bêtes que je pose.
 

Code :
  1. public class ArrayTest {
  2. public static void main(String[] args) {
  3.  Data[] datas = new Data[3];
  4.  datas[0] = new Data("First", 1);
  5.  datas[1] = new Data("Second", 2);
  6.  datas[2] = new Data("Third", 3);
  7.  Worker[] workers = new Worker[3];
  8.  for (int i = 0; i < workers.length; i++) {
  9.   workers[i] = new Worker(datas);
  10.  }
  11.  CloneWorker[] cloneWorkers = new CloneWorker[3];
  12.  for (int i = 0; i < cloneWorkers.length; i++) {
  13.   cloneWorkers[i] = new CloneWorker(datas);
  14.  }
  15.  workers[1].modifyName(1, "Second modified" );
  16.  workers[2].modifyValue(2, 4);
  17.  for (int i = 0; i < workers.length; i++) {
  18.   System.out.println("workers[" + i + "]" );
  19.   workers[i].printAll();
  20.  }
  21.  cloneWorkers[1].modifyName(1, "Second modified" );
  22.  cloneWorkers[2].modifyValue(2, 4);
  23.  for (int i = 0; i < cloneWorkers.length; i++) {
  24.   System.out.println("cloneWorkers[" + i + "]" );
  25.   cloneWorkers[i].printAll();
  26.  }
  27.  Data data = new Data("Fourth", 4);
  28.  BasicCloneWorker[] bcw = new BasicCloneWorker[3];
  29.  for (int i = 0; i < bcw.length; i++) {
  30.   bcw[i] = new BasicCloneWorker(data);
  31.  }
  32.  for (int i = 0; i < bcw.length; i++) {
  33.   System.out.println("basicCloneWorkers[" + i + "]" );
  34.   bcw[i].print();
  35.  }
  36.  bcw[1].modifyName("Second modified" );
  37.  bcw[2].modifyValue(3);
  38.  for (int i = 0; i < bcw.length; i++) {
  39.   System.out.println("basicCloneWorkers[" + i + "]" );
  40.   bcw[i].print();
  41.  }
  42. }
  43. }
  44. class Data implements Cloneable {
  45. private String name;
  46. private int value;
  47. public Data(String name, int value) {
  48.  this.name = name;
  49.  this.value = value;
  50. }
  51. public String getName() {
  52.  return name;
  53. }
  54. public int getValue() {
  55.  return value;
  56. }
  57. public void print() {
  58.  System.out.println("name: " + name + ", value: " + value);
  59. }
  60. public void setName(String name) {
  61.  this.name = name;
  62. }
  63. public void setValue(int value) {
  64.  this.value = value;
  65. }
  66. public Object clone() throws CloneNotSupportedException {
  67.  return new Data(name, value);
  68. }
  69. }
  70. class Worker {
  71. protected Data[] datas;
  72. public Worker(Data[] datas) {
  73.  this.datas = datas;
  74. }
  75. public void modifyName(int i, String name) {
  76.  datas[i].setName(name);
  77. }
  78. public void modifyValue(int i, int value) {
  79.  datas[i].setValue(value);
  80. }
  81. public void printAll() {
  82.  for (int i = 0; i < datas.length; i++) {
  83.   datas[i].print();
  84.  }
  85. }
  86. }
  87. class CloneWorker {
  88. protected Data[] datas;
  89. public CloneWorker(Data[] datas) {
  90.  this.datas = new Data[datas.length];
  91.  /*for (int i = 0; i < datas.length; i++) {
  92.   try {
  93.    this.datas[i] = (Data)datas[i].clone();
  94.   } catch (CloneNotSupportedException e) {
  95.    this.datas[i] = null;
  96.   }
  97.  }*/
  98.  this.datas = (Data[])datas.clone();
  99. }
  100. public void modifyName(int i, String name) {
  101.  datas[i].setName(name);
  102. }
  103. public void modifyValue(int i, int value) {
  104.  datas[i].setValue(value);
  105. }
  106. public void printAll() {
  107.  for (int i = 0; i < datas.length; i++) {
  108.   datas[i].print();
  109.  }
  110. }
  111. }
  112. class BasicCloneWorker {
  113. protected Data data;
  114. public BasicCloneWorker(Data data) {
  115.  try {
  116.   this.data = (Data)data.clone();
  117.  } catch (CloneNotSupportedException e) {
  118.   this.data = null;
  119.  }
  120. }
  121. public void modifyName(String name) {
  122.  data.setName(name);
  123. }
  124. public void modifyValue(int value) {
  125.  data.setValue(value);
  126. }
  127. public void print() {
  128.  data.print();
  129. }
  130. }


 
La partie vraiment utile c'est la partie entre /* ... */ qui implémente une méthode qui marche, tandis que le clone() ne marche pas.
 
Worker n'utilise pas clone : il fait tout par référence. C'est pourri, on sait.
 
CloneWorker essaye de cloner mais se loupe.
 
BasicCloneWorker clone mais un seul objet Data : là ça marche.
 
Maintenant que j'ai la méthode System.arrayCopy, je vais pouvoir modifier le comportement foireux. Par contre, j'aimerai savoir oui ou non, si arrayCopy se base sur la méthode clone des objets du tableau !


Message édité par Cherrytree le 30-08-2002 à 13:41:31

---------------
Le site de ma maman
n°205590
HappyHarry
Posté le 30-08-2002 à 13:48:11  profilanswer
 

je ne connais pas l'implémentation de arraycopy, mais etant donné que c'est une méthode native, je dirais que c une copie bit a bit

mood
Publicité
Posté le 30-08-2002 à 13:48:11  profilanswer
 

n°205604
Cherrytree
cn=?
Posté le 30-08-2002 à 13:59:07  profilanswer
 

HappyHarry a écrit a écrit :

je ne connais pas l'implémentation de arraycopy, mais etant donné que c'est une méthode native, je dirais que c une copie bit a bit



En effet, je viens de tester, c'est semblerait-il une copie à la sauvage. Aucun intérêt dans mon cas, donc. Moralité, le clonage custom de tableau, c'est à la main !


---------------
Le site de ma maman
n°205607
HappyHarry
Posté le 30-08-2002 à 14:00:35  profilanswer
 

Cherrytree a écrit a écrit :

En effet, je viens de tester, c'est semblerait-il une copie à la sauvage. Aucun intérêt dans mon cas, donc. Moralité, le clonage custom de tableau, c'est à la main !




 
me semblait te l'avoir dit deja  :ange:

n°205613
darklord
You're welcome
Posté le 30-08-2002 à 14:02:11  profilanswer
 

HappyHarry a écrit a écrit :

je ne connais pas l'implémentation de arraycopy, mais etant donné que c'est une méthode native, je dirais que c une copie bit a bit




 
oui. Ceci dit il ne me semble pas avoir insinué que arraycopy appelait clone des éléments. J'ai juste dit que tu si tu voulais un comportement spécial pour Data que tu devais redéfinir la méthode clone ...  
 
Enfin c ce que j'ai voulu dire.


---------------
Just because you feel good does not make you right
n°205615
darklord
You're welcome
Posté le 30-08-2002 à 14:02:37  profilanswer
 

DarkLord a écrit a écrit :

je crois avoir compris. Lorsque tu clones Datas tu voudrais qu'il prenne certaine chose en référence et d'autre en copie. tu peux qd meme utiliser arraycopy je pense mais tu dois redéfinir la méthode clone dans l'objet Data pour qu'il copie ce que tu veux copier et qu'il prenne la référence de ce que tu ne veux pas cloner.
 
A+




 
ah non. Bin desolaid je me suis planté  
 
sorry pour la confusion ...


---------------
Just because you feel good does not make you right
n°205617
Cherrytree
cn=?
Posté le 30-08-2002 à 14:04:04  profilanswer
 

HappyHarry a écrit a écrit :

 
 
me semblait te l'avoir dit deja  :ange:  



Bin j'étais persuadé qu'il y avait une méthode de clonage à la manière de clone pour les tableaux. Quand on m'a dit arraycopy, je me suis dit chouette, alors j'ai voulu en savoir plus. Il s'avère donc que c'est bien, mais pas pour moi. C'est quand j'ai voulu plus d'info que ça c'est gaté. Mais il est certain que ton aide m'a été très très très précieuse, merci, ami.
 
Et pardon à benou... :jap:


---------------
Le site de ma maman
n°205618
Cherrytree
cn=?
Posté le 30-08-2002 à 14:04:45  profilanswer
 

DarkLord a écrit a écrit :

 
 
ah non. Bin desolaid je me suis planté  
 
sorry pour la confusion ...



Spagrave. :hello:


---------------
Le site de ma maman
n°205619
HappyHarry
Posté le 30-08-2002 à 14:04:47  profilanswer
 

pour en revenir a ton test de clonage ? il se passe quoi ? qu'appelles tu "comportement bizarre" ?

n°205621
darklord
You're welcome
Posté le 30-08-2002 à 14:06:19  profilanswer
 

peut etre des infos utiles :??:
 
http://forum.hardware.fr/forum2.php3?post=22712&cat=10


---------------
Just because you feel good does not make you right
n°205622
Cherrytree
cn=?
Posté le 30-08-2002 à 14:06:58  profilanswer
 

Bin la méthode clone() sur un tableau, c'est comme si elle n'y était pas. Il passe une référence et ne signale même pas qu'il faut catcher l'exception CloneNotSupportedException, du coup, le fonctionnement de CloneWorker et exactement identique à celui de Worker (regarde les constructeurs des deux classes, c'est la seule chose qui change). Le bloc entre /* ... */ donne la solution à la mano, qui fait ce que je veux.


---------------
Le site de ma maman
n°205638
HappyHarry
Posté le 30-08-2002 à 14:13:58  profilanswer
 

ben oui c cette solution qu'il faut adopter...

n°205639
Cherrytree
cn=?
Posté le 30-08-2002 à 14:15:39  profilanswer
 

HappyHarry a écrit a écrit :

ben oui c cette solution qu'il faut adopter...



Alors mon problème est résolu.


---------------
Le site de ma maman
n°205755
benou
Posté le 30-08-2002 à 15:26:28  profilanswer
 

Cherrytree a écrit a écrit :

Bin j'étais persuadé qu'il y avait une méthode de clonage à la manière de clone pour les tableaux. Quand on m'a dit arraycopy, je me suis dit chouette, alors j'ai voulu en savoir plus. Il s'avère donc que c'est bien, mais pas pour moi. C'est quand j'ai voulu plus d'info que ça c'est gaté. Mais il est certain que ton aide m'a été très très très précieuse, merci, ami.
 
Et pardon à benou... :jap:




désolé, j'ai pas été très présent ce matin.
D'après ce que j'ai compris à ton problème, en effet, la arrayCopy ne va pas convenir puisqu'il va juste faire une copie des référence des objets Data => tu auras 2 tableaux qui pointeront les même objets.
 
A ma connaissance, il n'y a pas de méthode pour faire un deep clone sur un tableau.
mais bon, tu fais ca en 3 ligne, hein !

n°205757
Cherrytree
cn=?
Posté le 30-08-2002 à 15:30:47  profilanswer
 

benou a écrit a écrit :

 
désolé, j'ai pas été très présent ce matin.
D'après ce que j'ai compris à ton problème, en effet, la arrayCopy ne va pas convenir puisqu'il va juste faire une copie des référence des objets Data => tu auras 2 tableaux qui pointeront les même objets.
 
A ma connaissance, il n'y a pas de méthode pour faire un deep clone sur un tableau.
mais bon, tu fais ca en 3 ligne, hein !
 



Voui, c'était fait depuis hier, mais je trouvais ça moche. Par contre, tu confonds : les Datas ne sont pas des références, mais leurs objets Task le sont. ;)


---------------
Le site de ma maman
n°205776
benou
Posté le 30-08-2002 à 15:43:53  profilanswer
 

Cherrytree a écrit a écrit :

Voui, c'était fait depuis hier, mais je trouvais ça moche. Par contre, tu confonds : les Datas ne sont pas des références, mais leurs objets Task le sont. ;)  




ben Data c'est un objet. Donc un tableau de Data c'est un tableau de référence, donc je ne me trompe pas :o

n°205777
HappyHarry
Posté le 30-08-2002 à 15:44:41  profilanswer
 

benou a écrit a écrit :

 
ben Data c'est un objet. Donc un tableau de Data c'est un tableau de référence, donc je ne me trompe pas :o




 
je t dit de dormir un peu petit cerisier ... t'as trop trop de mal aujourd'hui ... :sarcastic:  

n°205783
Cherrytree
cn=?
Posté le 30-08-2002 à 15:49:25  profilanswer
 

HappyHarry a écrit a écrit :

 
 
je t dit de dormir un peu petit cerisier ... t'as trop trop de mal aujourd'hui ... :sarcastic:  



:(  [:ddr555] Peut pas.


---------------
Le site de ma maman
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[C++] Comment recuperer un fichier en local par http?? [RESOLU]<DIV> : problème de position absolue et relative [résolu]
[C++ BUILDER]Utilisation de TImage [RESOLU][résolu][poo/c++] héritage, constructeur et destructeurs
[Java] Remplacer un string par un string (Résolu)[resolu][builder] evenement onmousexxx && fenetre opengl
[PHP] besoin d'aide pour faire tout en un seul fichier... [RESOLU][JS] trouve pas de titre, problmes de syntax?[resolu]
JscrollPane contenant un JTextArea et défilement automatique [Resolu][C/C++] Supprimer un répertoire (ou le vider) [Resolu]
Plus de sujets relatifs à : Clonage d'objets RESOLU


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)