[java] Question de gros noob sur l'allocation mémoire.

Question de gros noob sur l'allocation mémoire. [java] - Java - Programmation

Marsh Posté le 12-08-2004 à 18:44:19    

Code :
  1. public class LiOPermutation extends LiOIndividual{
  2. //seule donnee membre
  3. private int[] mChain;
  4. public LiOPermutation()
  5. {
  6. //LiO est juste une autre classe
  7.         size =LiO.size;
  8.         mChain = new int[size];
  9.      }
  10. public void improve ()
  11. {
  12.  double bestEvaluation, evaluation;
  13.  LiOPermutation tmp, bestPermutation;
  14.  bestEvaluation = evaluation = this.value ();
  15.  bestPermutation = this;
  16.  //tmp = new LiOPermutation ();
  17.  /** look for the best permutation */
  18.  for (int i = 0; i < size; i++)
  19.   for (int j = i+1; j < size; j++)
  20.   {
  21.    //selon vous ci-dessus, ca passe ou ca casse ?
  22.    tmp.copy (this);
  23.    ...
  24.   }
  25. }
  26. }


 
à l'instruction "tmp.copy (this);" ca passe ou ca casse selon vous ?
je précise bien que l'instruction "tmp = new LiOPermutation ();" est en commentaire.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 12-08-2004 à 18:44:19   

Reply

Marsh Posté le 12-08-2004 à 20:24:17    

Non.
tmp vaut null à ce moment donc un joli NullPointerException t'attend derrière le buisson
 

Reply

Marsh Posté le 12-08-2004 à 23:26:36    

Citation :

Sujet : Question de gros noob


ta gueule sale noobs, va lire le manuel en cherchatn google.
 
 
 
(scusez, des fois ça fait du bien)
 
Sinon, pour paraphraser au-dessus, les variables de type référence sont initialisées par défaut à null. Appeller une mathode sur null conduit à une NullBiduleException, appellée aussi NPE.

Reply

Marsh Posté le 13-08-2004 à 10:45:06    

Ha jsuis content vous me rassurez :). Bon, quand je lance tout ça au debugger, le contenu de la variable tmp est :
tmp = [0, 0, 0, 0] (le tableau mChain est de taille 4). Le pointeur tmp n'est donc pas nul ! et donc l'instruction passe très bien.
Pourquoi ?  :??: ... je l'ignore completement. Au debuggeur sans faire un stepin dans cette methode improve (et toujours sans l'instruction new), tout se déroule bien. Donc pourquoi tmp = [0, 0, 0, 0] et non null ?  [:figti]


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 13-08-2004 à 11:12:52    

Après avoir commenté cette fameuse ligne, le source a bien été recompilé ??

Reply

Marsh Posté le 13-08-2004 à 11:16:31    

pascal34 a écrit :

Après avoir commenté cette fameuse ligne, le source a bien été recompilé ??


 
 :jap: tout a fait, d'ailleur je viens juste de démarrer javabeans la, et tout marche bien. (toujours sans l'instruction new).
Conclusion : ca sert a rien l'instruction "tmp = new ..." :D
 
Apparemment, oublié l'instruction new, ce n'est pas un plantage systematique. Un peu comme faire deux instruction delete successive en C++ sur le meme objet. Par contre a terme ca peut planter.


Message édité par Giz le 13-08-2004 à 11:18:16

---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 13-08-2004 à 13:36:01    

non, giz, tu t'es planté quelquepart.

Reply

Marsh Posté le 13-08-2004 à 14:42:53    

Giz a écrit :

:jap: tout a fait, d'ailleur je viens juste de démarrer javabeans la, et tout marche bien. (toujours sans l'instruction new).
Conclusion : ca sert a rien l'instruction "tmp = new ..." :D
 
Apparemment, oublié l'instruction new, ce n'est pas un plantage systematique. Un peu comme faire deux instruction delete successive en C++ sur le meme objet. Par contre a terme ca peut planter.


 
Ta méthode copy(), elle est pas déclarée 'static' par hasard ???

Reply

Marsh Posté le 13-08-2004 à 15:07:49    

pascal34 a écrit :

Ta méthode copy(), elle est pas déclarée 'static' par hasard ???


 
non.
J'avais donc corrigé en mettant le new. Et maintenant je ne peux plus revenir comme avt. (sans le new) ca compile plus, ca me dit "lio/individuals/permutations/LiOPermutation.java [151:1] variable tmp might not have been initialized "
 
Ca devait etre le fichier .class qui merdait (ca recompilait pas vraiment).


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 16-08-2004 à 08:57:20    

Giz a écrit :

non.
J'avais donc corrigé en mettant le new. Et maintenant je ne peux plus revenir comme avt. (sans le new) ca compile plus, ca me dit "lio/individuals/permutations/LiOPermutation.java [151:1] variable tmp might not have been initialized "
 
Ca devait etre le fichier .class qui merdait (ca recompilait pas vraiment).


 
Ca m'arrive quelques fois sous Eclipse

Reply

Marsh Posté le 16-08-2004 à 08:57:20   

Reply

Marsh Posté le 20-08-2004 à 18:43:33    

Tiens une autre question de noob qui me passe par la tête :) :
 
voici l'instruction suivante :

Code :
  1. if ((upperBound - lowerBound) > Integer.MAX_VALUE)
  2. ...


 
précision :
 
upperBound et lowerBound sont 2 int de valeurs quelconques avec upperBound > lowerBound.
 
 
questions :
 
-En gros, comment le compilateur calcule la valeur (upperBound - lowerBound) et où la stocke-t-elle temporairement pour la comparer à Integer.MAX_VALUE ?  [:figti]  
-Ce test marche-t-il ? Si oui, comment ça se passe tout ça en mémoire ?  [:figti]  
 
- mêmes questions mais avec le test :

Code :
  1. if ((upperBound - lowerBound) > Double.MAX_VALUE)
  2. ...


 
upperBound et lowerBound sont 2 doubles de valeurs quelconques avec upperBound > lowerBound.
 
Merci  :hello:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 21-08-2004 à 17:59:50    

Giz a écrit :


Code :
  1. if ((upperBound - lowerBound) > Integer.MAX_VALUE)
  2. ...




ça vaut toujours true, à partir du moment où un entier est toujours compris entre MIN_VALUE et MAX_VALUE

Reply

Marsh Posté le 23-08-2004 à 12:34:59    

tu voulais dire false


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2004 à 16:40:32    

raytaller a écrit :

ça vaut toujours true, à partir du moment où un entier est toujours compris entre MIN_VALUE et MAX_VALUE


 
C'est vrai que je me posais une question sans penser a la logique du test qui voulait dire "cet entier est-il sup au plus gros des entiers" forcément c'est faux. Du coup faudrait caster le "upperBound - lowerBound" en double pour faire la comparaison  :)


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 23-08-2004 à 22:10:18    

the real moins moins a écrit :

tu voulais dire false


 
exact

Reply

Marsh Posté le 24-08-2004 à 13:25:13    

Encore une question de noob. (on devrait en faire un topik unique : [topik unik] Question de noobs :D)
 
Quand on a une classe de base abstraite, y-a-t-il moyen d'y définir un constructeur abstrait de façon à ce que toutes les classes dérivées aient ce contructeur avec CE prototype implémenté. Je pense notamment au constructeur par copie qui garantie bien que l'utilisateur travaillera sur une copie et pas sur une reférence sur l'objet original.
 
Merci  [:icon10]


Message édité par Giz le 24-08-2004 à 13:25:54

---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 24-08-2004 à 13:32:26    

non, les constructeurs ne sont pas hérités, mais oui, on peut appeller les constructeurs de la super-classe depuis les constructeurs des sous-classes et oui, on peut mettre des constructeurs dans une classe abstraite :


abstract class C {
  private int var;
  public C(int var) {
    this.var = var;
  }
}
 
public class D extends C {
  public D() {
    super(10);
  }
}


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 24-08-2004 à 13:54:28    

nraynaud a écrit :

non, les constructeurs ne sont pas hérités


sauf le constructeur sans argument, pour peu qu'on ne définisse pas d'autre constructeur.
 
 
... enfin quelque chose dans ce genre là [:augie]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-08-2004 à 14:47:13    

ratai.
 
2 choses :
1)si on défini pas de constructeur, un constructeur public sans argument avec un corps vide est syntétisé
 
2)tout constructeur qui n'appelle pas explicitement un autre constructeur appelle implicitement super(). en générant des erreurs si c'est pas possible, j'ai créé un topic à ce sujet il y a un paquet de temps.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 24-08-2004 à 15:32:43    

euh le (2) est valide uniquement pour un constructeur sans argument ou bien un constructeur a argument appelle aussi implicitement le super() ???
 
et pour le (1) oui jme suis vautré, par contre les définir dans une class abstraite qu'on étend permet d'obliger le développeurs à définir au - un constructeur, du coup avec un peu de pot s'il est pas trop con il fera appel au bon super(..)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-08-2004 à 15:53:36    

the real moins moins a écrit :

euh le (2) est valide uniquement pour un constructeur sans argument ou bien un constructeur a argument appelle aussi implicitement le super() ???


ce qu'a dit nraynaud est valable dans tous les cas


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-08-2004 à 16:33:08    

tous les constructeurs appellent donc le super() implecititement, sauf s'ils appellent un autre super(...)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-08-2004 à 17:14:00    

the real moins moins a écrit :

tous les constructeurs appellent donc le super() implecititement, sauf s'ils appellent un autre super(...)

sauf s'ils appellent un autre super() ou un autre this()
 
la logique est simple : on construit l'objet par "étages" en partant du plus concret. Et il est interdit de ne pas construire tous les étages jusqu'à Object, ce qui dans certains cas piège ceux qui ne le savent pas.
 
edit : on construit l'objet par étage, du plus concret jusqu'à Object, en passant soit des this(..) pour rester dans l'étage soit super(...) pour passer à l'étage immédiatement supérieur (je rappelle que les constructeurs ne sont pas hérités donc impossible de sauter des étages, d'autre part ça serait dangereux).


Message édité par nraynaud le 24-08-2004 à 17:17:23

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed