OCaml for 循环似乎重新执行的次数超出了预期

问题描述 投票:0回答:1

我有以下功能

let update s = 
  for i=0 to ((Array.length s) - 2) do 
    for j=0 to (Array.length (s.(i))) - 2 do 
      (s.(i)).(j) <- (s.(i).(j)) + 1;
    done;
  done

并且每调用一次,它似乎都会将 2D 数组

s
的相关坐标增加 2。

下面是完整的代码,如果它有助于了解我如何使用这些东西。

后端.ml

type sim = int array array

let create m n = Array.make m (Array.make n 0)

let update s = 
  for i=0 to ((Array.length s) - 2) do 
    for j=0 to (Array.length (s.(i))) - 2 do 
      (s.(i)).(j) <- (s.(i).(j)) + 2;
    done;
  done

let toString s =
  let rows = Array.length s in 
  if rows = 0 then "--\n||\n--"
  else
    let cols = Array.length s.(0) in 
    let st = ref "--\n" in
    for i=0 to rows-1 do 
      for j=0 to cols-1 do 
        st := !st ^ (string_of_int s.(i).(j)) ^ ","
      done;
      st := !st ^ "\n"
    done;
    !st 

main.ml

open Test.Backend

let sim = create 
          (int_of_string Sys.argv.(1)) 
          (int_of_string Sys.argv.(2))

;;
while true do
  print_endline (toString sim);
  update sim;
  Unix.sleepf 1.;
done

使用命令行参数 3 和 10 运行此程序的打印输出如下所示。

--                                 
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,

--
2,2,2,2,2,2,2,2,2,0,
2,2,2,2,2,2,2,2,2,0,
2,2,2,2,2,2,2,2,2,0,

--
4,4,4,4,4,4,4,4,4,0,
4,4,4,4,4,4,4,4,4,0,
4,4,4,4,4,4,4,4,4,0,

我什至无法猜测它为什么这样做。我扔了一堆括号,调整了一些数字,只是为了看看它是否会改变什么。我也不明白为什么这会更新最后一行,因为我尝试减去“太多”。我猜这在某种程度上与添加太多次的问题有关。但当我尝试从逻辑上解析它时,我只是看不出这是如何发生的。


经过修改,我在 update 函数中添加了一行打印代码,发现 while 循环每执行一次,update 函数就会被调用两次。所以现在我不明白为什么会发生这种情况,但这是进步!

arrays loops ocaml
1个回答
0
投票

你的问题就在这里:

let create m n = Array.make m (Array.make n 0)

您已经创建了一个数组,其中

m
引用了带有 n 零的
same
数组。

考虑:

# let m = Array.make 2 (Array.make 2 2);;
val m : int array array = [|[|2; 2|]; [|2; 2|]|]
# m.(0).(0) <- 8;;
- : unit = ()
# m;;
- : int array array = [|[|8; 2|]; [|8; 2|]|]

您可能想使用

Array.make_matrix

# let m = Array.make_matrix 2 2 2;;
val m : int array array = [|[|2; 2|]; [|2; 2|]|]
# m;;
- : int array array = [|[|2; 2|]; [|2; 2|]|]
# m.(0).(0) <- 8;;
- : unit = ()
# m;;
- : int array array = [|[|8; 2|]; [|2; 2|]|]
© www.soinside.com 2019 - 2024. All rights reserved.