2014-11-03 45 views
0

对不起,如果标题和问题不清楚;我没有一个好的方式来描述它。但这里是:混淆ParamArray行为 - 重复数组以某种方式链接?

所以发生的事情是“testMat”以某种方式连接在一起,即使我没有重新定义它们,它也会使值发生变化。例如,如果你在下面运行这个代码,你会发现在testResult的matSum函数中,out1和out2的值正在改变(在循环中),我不知道为什么!它们的值在testResult1中不会改变。这种行为从何而来?

Sub Main() 

    Dim testMat As Double(,) = {{1, 2}, {3, 4}} 

    Dim testResult As Double(,) = matSum(testMat, testMat, testMat) 
    Dim testResult1 As Double(,) = matSum({{1, 2}, {3, 4}}, {{1, 2}, {3, 4}}, {{1, 2}, {3, 4}}) 

End Sub 


Function matSum(ByVal ParamArray args As Double()(,)) As Double(,) 
    'This function sums matrices. It assumes you know how to sum matrices. 

    Dim m, n As Integer 
    Dim out, out1, out2 As Double(,) 
    Dim numArgs As Integer = args.Length 

    out = args(0) 
    out1 = args(1) 
    out2 = args(2) 
    m = out.GetUpperBound(0) 
    n = out.GetUpperBound(1) 

    For v As Integer = 1 To numArgs - 1 
     For i As Integer = 0 To m 
      For j As Integer = 0 To n 
       out(i, j) = out(i, j) + args(v)(i, j) 
      Next 
     Next 
    Next 

    Return out 

End Function 
+1

数组是一个引用类型,这就是它发生的原因。它与'ParamArray'无关。 – MarcinJuraszek 2014-11-03 03:20:22

+0

对不起,你能详细说一下吗?我以为我读到ParamArray只是ByVal? (或者这不是你指的?) – Esteban 2014-11-03 03:25:13

+0

'ByVal',你不能改变'args'的身份(例如,你不能让'args'指向一个新的或不同的数组),但是你可以改变它的内容 - 即数组元素。 – 2014-11-03 03:33:16

回答

1

好吧,让它多一点上下文。

数组是参考类型,所以当它通过时ByVal正在传递的值是参考。该数组未被复制或克隆。参考是。但它仍然指向内存中的同一个数组。

现在,当你在这里调用你的方法。

Dim testResult As Double(,) = matSum(testMat, testMat, testMat) 

outout1out2具有相同的值 - 参照testMat。使用这些变量中的任何一个修改该数组中的值将修改相同的数组,并且您还会从其他参考中看到它。

+1

谢谢,我想我明白了。当Matlab是您的主要“语言”时,这些就是您遇到的问题。 – Esteban 2014-11-03 04:28:25