【问题标题】:F# - assigning element in (jagged) 2d-array sets several elements [duplicate]F# - 在(锯齿状)二维数组中分配元素设置几个元素[重复]
【发布时间】:2016-03-08 08:57:59
【问题描述】:

我在 f# 中遇到一些我不理解的行为。我试图使用嵌套数组创建一个二维表。子数组将具有相同的长度,所以我可以使用 Array2D。但是稍后我将需要将表行作为普通数组,因此为了避免从多维数组转换为常规数组,我想将表表示为锯齿状数组。

以下代码是我如何初始化和分配表中元素的示例。

let table = Array.create 3 (Array.zeroCreate<int> 2);;
table.[0].[0] <- 1;;

我希望这段代码设置第一行中的第一个元素。然而,它实际上所做的是设置所有三行中的第一个元素。

table;;
val it : int [] [] = [|[|1; 0|]; [|1; 0|]; [|1; 0|]|]

为什么table.[0].[0] 设置所有三个子数组中的第一个元素?我尝试使用System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement 查找子数组的内存地址,在我看来它们是不同的,所以它们三行不是同一个数组。这是怎么回事?

【问题讨论】:

    标签: arrays multidimensional-array f#


    【解决方案1】:

    当您使用array.create 时,它会将对象而不是函数作为参数。

    因此,锯齿状数组的每个元素都是对同一数组的引用,因此您会得到观察到的行为。

    只需使用array.create以外的函数来制作数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多