所以我最近刚开始为我的大学用ocaml编程(这里是必需的)。我必须编写一个函数unit->(int*int) Array,它创建一个16x16的矩阵,其中的条目是接受4个元组的数组。
我被明确地告知不要递归地编写这个函数,所以我做了这样的事情:
let matrice_deplacements () =
let u = Array.make 16 (Array.make 16 [||]) in
for k=0 to 15 do
for p=0 to 15 do
u.(k).(p)<-deplacement_grille (k,p)
done;
done;
u;;
而且我确信函数deplacement_grille (请原谅法语)工作得很好,并且给出了我想要的(这是正确的(int*int)数组,对于好的k和p)
我完全不知道问题出在哪里,因为每次我运行这段代码(我尝试了2*2和3*3矩阵,它都不起作用),ocaml返回一个矩阵,其中所有行都是相同的(它们实际上应该是最后一行)。
任何帮助都是非常感谢的。实际上我想知道这是否归结于ocaml存储数组的方式,它可能像python一样,它们有相同的地址。
发布于 2020-04-11 20:05:38
我建议参考documentation of Array.make
,它解释了以这种方式构造的数组具有物理上相等的元素。因此,您的初始代码行构建了2个不同的数组,而不是您期望的17个。(必须如此,因为在将内部构造函数应用程序(Array.make 16 [||]
)传递给外部数组的构造函数之前,它的计算结果是单个数组。)
您可能需要Array.init
,它为每个索引构造一个新的元素。还有Array.make_matrix
,它类似于Array.make
,因为矩阵元素最初在物理上是相等的。
https://stackoverflow.com/questions/61156369
复制相似问题