[ocaml] Référence à un object Null ?

Référence à un object Null ? [ocaml] - Divers - Programmation

Marsh Posté le 10-10-2004 à 17:10:06    

Je ne trouve pas dans les différentes doc comment vérifier qu'un object est réellement instancié. Je voudrais faire un truc du genre :

Code :
  1. class noeud =
  2. object (this)
  3.         val mutable c = ""
  4.         val mutable fini = false
  5.         val mutable fils = Null
  6.         val mutable frere = Null
  7. (*Methodes d'access et de modification des attributs de la classe*)
  8. method getC = c
  9. method setC(str) = c <- str
  10. method setFrere(f) = frere<-f
  11. method setFils(f) = fils<-f
  12. method getFrere = if (frere#isNull) then new noeud else frere
  13. method getFils = if (fils#isNull) then new noeud else fils
  14. method isNull = (c = "" )
  15. method isFini = fini
  16. method setFini(b) = fini<-b


 
mais pas moyen, du coup, j'ai cru gruger en faisant

Code :
  1. class noeud =
  2. object (this)
  3.         val mutable c = ""
  4.         val mutable fini = false
  5.         val mutable fils = new noeud
  6.         val mutable frere = new noeud
  7. (*Methodes d'access et de modification des attributs de la classe*)
  8. method getC = c
  9. method setC(str) = c <- str
  10. method setFrere(f) = frere<-f
  11. method setFils(f) = fils<-f
  12. method getFrere = if (frere#isNull) then new noeud else frere
  13. method getFils = if (fils#isNull) then new noeud else fils
  14. method isNull = (c = "" )
  15. method isFini = fini
  16. method setFini(b) = fini<-b


 
mais évidemment, ça crash dés que je crée une instance de noeud, puisque ça crée des noeud en boucle...
 
donc, comment déclarer mes variqbles à null ?
 
merci !


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 10-10-2004 à 17:10:06   

Reply

Marsh Posté le 10-10-2004 à 18:30:35    

héhéhé, y'a pas de null en o'caml, il faut le créer toi-même :
 
type maybenode = None | Some noeud;;


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

Marsh Posté le 11-10-2004 à 08:57:25    

merci pour ta réponse !
 
pardon de faire le lourd, mais il y a un problème de syntaxe
Si je mets le code que tu m'as donné, syntaxe error
j'ai essayé type maybenode = None | Some of noeud ;; mais noeud n'est pas encore déclaré
avec  
type maybenode = None | Some;; le problème viens avec  
val mutable fils = Null
et
frere#isNull
==> j'ai un truc genre
This expression has type maybenode
It has no method isNull
 
 
merci pour tes éclairsissements (ortho ?!) :jap:


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 12-10-2004 à 14:17:56    

hum, comme je travaille pas avec des objets, je te file un truc générique :
 
type 't maybe = None | Some of 't
 
ensuite, il faut adapter à ton type somme :
method getFrere = match frere with
  | None -> ...
  | Some f -> ...


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

Marsh Posté le 12-10-2004 à 14:20:01    

sinon, pour les types mutuellement récusifs, on utilise and :
 
type maybeMoncul = None | Some of moncul
and type moncul = ...
 
 
enfin, il me semble. la doc du langage est très bien faite, tu peux la consulter si tu as un doute.


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

Marsh Posté le 12-10-2004 à 18:02:44    

j'ai envie de dire...
 
 
 
 
 
merci beaucoup de ton aide !!!


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 14-10-2004 à 20:02:26    

Je sais, j'abuse, mais je n'y arrive toujours pas... :

Code :
  1. type 't maybenode = None | Some of 't
  2. class noeud =
  3. object
  4.         val mutable c = ""
  5.         val mutable fini = false
  6.         val mutable fils : noeud maybenode = None
  7. val mutable frere : noeud maybenode = None
  8. (*Methodes d'access et de modification des attributs de la classe*)
  9. method getC = c
  10. method setC(str) = c <- str
  11. method setFrere(f) = frere<-f
  12. method setFils(f) = fils<-f
  13. (*
  14. method getFrere = if (frere#isNull) then new noeud else frere
  15. method getFils = if (fils#isNull) then new noeud else fils
  16. *)
  17. method getFrere = match frere with
  18.  None -> new noeud
  19.  |Some noeud -> frere
  20. method getFils = match fils with
  21.  None -> new noeud
  22.  |Some noeud -> fils
  23. method isNull = (c = "" )
  24. method isFini = fini
  25. method setFini(b) = fini<-b
  26. (*Methode de recherche de mot dans l'arbre*)
  27. method exists(str) =
  28.  let lettre = String.sub str 0 0 in
  29.  let len = String.length str  in
  30.  let finMot = len<=1 in
  31.  let fin =
  32.   if (finMot) then
  33.    ""
  34.   else
  35.    String.sub str 1 len in
  36.  if (lettre = c) then
  37.   if (finMot) then
  38.    fini
  39.   else
  40.    if (fils#isNull) then
  41.     false
  42.    else
  43.     fils#exists(fin)
  44.  else
  45.   if (frere#isNull) then
  46.    false
  47.   else
  48.    frere#exists(str)
  49. (*Methode d'ajout dans l'arbre*)
  50. method add(str) =
  51.  let estFin = fini in
  52.  if (String.length str > 0) then
  53.  begin
  54.   let lettre = String.sub str 0 0 in
  55.   let fin = String.sub str 1 (String.length str - 1) in
  56.   fini <- String.length str = 0;
  57.   if (this#isNull) then
  58.   begin
  59.    c<-lettre;
  60.    if (not fini) then
  61.     fils#add(fin)
  62.   end
  63.   else if ( c = lettre && not fini) then
  64.    fils#add(fin)
  65.   else
  66.   begin
  67.    if (not fini) then
  68.     frere#add(str)
  69.   end;
  70.  end;
  71.  fini <- fini || estFin
  72. end;;


 
à la compilation, je recoit : This expression has type noeud maybenode
It has no method isNull
 
J'arrive pas à voir comment lui expliker que noeud maybenode, ben c'est un noeud...
 
j'ai beau lire des docs, je ne voit toujours pas comment faire ça...
 
je viends de java, et null me manque beaucoup :'(


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 14-10-2004 à 20:36:25    

il faut que partout où tu utilises un 't maybenode, tu fasses un match machin, c'est ce qu'on appelle un destructeur.
 
donc partout où tu utilises frere ou fils. c'est ce que fait java à chaque fois qu'il y a machin.bidule, il vérifie que machin n'est pas null.


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

Marsh Posté le 15-10-2004 à 07:39:02    

brisssou a écrit :

Je sais, j'abuse, mais je n'y arrive toujours pas... :
 


 
Tu peux p-ê t'inspirer du code pour un arbre binaire :
cs.wellesley.edu/~cs251/ocaml-data.pdf
 
ou de celui-ci : http://www.lri.fr/~filliatr/ftp/oc [...] et.ml.html


Message édité par el muchacho le 15-10-2004 à 07:49:30
Reply

Sujets relatifs:

Leave a Replay

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