6

私はレコード型 tt の配列を持っています - 元々はより多くのコンポーネントを持っていました;-) - そして for ループ内でその値を変更したい:

type tt={mutable x: int};;
let f0={x= -1};;
let max=10;;
let ff=Array.create max f0;;
for i=0 to max-1 do ff.(i).x <- i;done;;

それにもかかわらず、ff のすべてのフィールドは、0 から 9 までの値ではなく、値 9 を持ちます。ff.(i).x は正しいですか? 私も試しました

for i=0 to max-1 do f0.x <- i;ff.(i) <- f0;done;;

しかし、結果は同じです... (私は OCaml バージョン 4.00.1 を使用しています) 何が問題なのですか? どなたかヒントを頂けたら嬉しいです!

4

3 に答える 3

9

Array.createこれは、初心者が可変状態で行う典型的な間違いです。そこで詳しく説明しました。要約すると、Array.create n fooのコピーは作成されずfoo(どうやってできたのでしょうか?)、すべて同じ を指すケースの配列が作成されますfoo

于 2012-12-22T09:37:12.117 に答える
4

ff問題は、配列のすべてのセルに同じ要素、つまりが含まれていることf0です。ttセルごとにタイプの新しい要素を作成する必要があります。これはそうする方法です:

type tt={mutable x: int};;
let max=10;;
let ff=Array.init max (fun i -> {x= i});;

他のセルに影響を与えずにセルを変更できるようになりました。

于 2012-12-22T09:38:54.173 に答える
3

問題は、レコードが可変であるため、可変でないデータ型 (整数として) から期待されるように、値ではなく参照によって格納されることです。

let ff=Array.create 10 f0;;

実際には、同じレコードへの参照を 10 個格納しています。そして、各反復

for i=0 to max-1 do ff.(i).x <- i;done;;

同じ参照を複数回更新するだけなので、最後の反復は with であるためi = 9、配列に含まれる唯一の実際のレコードがその値を取得します。

あなたがする必要があるのは、次のような10の異なるレコードを作成することです:

# type tt = {mutable x: int};;
type tt = { mutable x : int; }
# let f = Array.init 10 (fun i -> { x = -1});;
val f : tt array =
  [|{x = -1}; {x = -1}; {x = -1}; {x = -1}; {x = -1}; {x = -1}; {x = -1};
    {x = -1}; {x = -1}; {x = -1}|]
# f.(2).x <- 2;;
- : unit = ()
# f;;
- : tt array =
[|{x = -1}; {x = -1}; {x = 2}; {x = -1}; {x = -1}; {x = -1}; {x = -1};
  {x = -1}; {x = -1}; {x = -1}|]
于 2012-12-22T09:46:24.183 に答える