From: Samuel Mimram <Samuel.Mimram@ens-lyon.fr>
To: WatchDog <watchdog@free.fr>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Problem in modifying a mutable element in an array
Date: Sun, 16 Feb 2003 00:07:42 +0100 [thread overview]
Message-ID: <20030216000742.3376f3bc.Samuel.Mimram@ens-lyon.fr> (raw)
In-Reply-To: <3E4EC399.20200@free.fr>
Hello,
Your "problem" is due to the fact that when you use the function make_vect m agent_init, Caml creates an array where all element are pointing at the same object which is agent_init : in your whole program, there is only one instance of agent_init in memory.
I think that the only solution is to make the initilization of f by hand :
let agent_init () = { initial = 0 ; courant = 0 ; longueur = 0.; liste_parcourue = [] ; à_visiter = make_vect n 1 } ;;
let f = make_vect m (agent_init ());;
for i = 0 to ((vect_length f)-1)
do
f.(i) <- agent_init ()
done
The use of a function which takes a unit argument is important because each time you call it, it returns a NEW record.
I hope this helps.
Samuel.
On Sat, 15 Feb 2003 23:47:53 +0100
WatchDog <watchdog@free.fr> wrote:
> Hello !
> My problem has first appeared in a CamlLight implementation, but I have
> then tried to do the same on O'Caml and the problem remained equal. But
> I'm sure you'll be able to provide some help, won't you ?
> In Caml Light :
>
> #open "random";;
> type agent = { mutable initial : int ; mutable courant : int ;
> mutable longueur : float ; mutable liste_parcourue : int
> list ;
> à_visiter : int vect } ;;
> let agent_init = { initial = 0 ; courant = 0 ; longueur = 0. ;
> liste_parcourue = [] ;
> à_visiter = make_vect n 1 } ;;
> let f = make_vect m agent_init ;;
>
> let set_f () = for p = 0 to (m-1) do
> begin
> f.(p).initial <- (int n) ;
> f.(p).courant <- (int n) ;
> f.(p).liste_parcourue <- [(int n)] ;
> f.(p).à_visiter.(int n) <- 0
> end
> done
> ;;
>
>
> And then set_f() doesn't work properly : it seems Caml refuses to modify
> one element (for instance f.(5).initial) without modifying automatically
> all its brothers, e.g. all the f.(i).initial ; for i from 0 to (m-1).
> The fact is that I'd like to modify it element-by-element, and not all
> at the same time.
>
> Your help would be a real relief !!
> Thanks
>
> JB, from Paris.
>
> -------------------
> To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
> Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
--
Samuel Mimram
Samuel.Mimram@ens-lyon.fr
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next prev parent reply other threads:[~2003-02-15 23:10 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-02-15 22:47 WatchDog
2003-02-15 23:07 ` Samuel Mimram [this message]
2003-02-17 3:29 ` Issac Trotts
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20030216000742.3376f3bc.Samuel.Mimram@ens-lyon.fr \
--to=samuel.mimram@ens-lyon.fr \
--cc=caml-list@inria.fr \
--cc=watchdog@free.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox