2014-11-03 6 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

+0

죄송합니다. 조금 더 자세히 설명해 주시겠습니까? 나는 ParamArray가 단지 ByVal 일 뿐이라고 생각했다. (아니면 당신이 말하는 것과 다른가요?) – Esteban

+0

'ByVal'을 사용하면 'args'의 ID를 변경할 수 없습니다 (예 : 'args'가 새 배열이나 다른 배열을 가리킬 수 없음). 배열 요소와 같은 내용을 변경할 수 있습니다. –

답변

1

확인을 클릭하면 더 많은 정보를 얻을 수 있습니다.

배열은 참조 유형이므로 이 전달되면 ByVal 전달되는 값은입니다. 배열이 복사되거나 복제되지 않습니다. 참조는입니다. 그러나 여전히 메모리의 동일한 배열을 가리 킵니다.

이제 여기에서 방법을 호출하십시오.

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

out, out1out2과 동일한 값을 가질 - testMat 참조한다. 이러한 변수 중 하나를 사용하여 해당 배열 내의 값을 수정하면 동일한 배열이 수정되므로 다른 참조에서도 해당 값이 표시됩니다.

+1

감사합니다. 나는 구별이 있다고 생각합니다. 이것은 Matlab이 주요 "언어"일 때 얻을 수있는 문제입니다. – Esteban