2016-11-14 185 views
-1

我有一個二維數組,其大小在()內不是靜態的。即代碼將在稍後分配大小。我想傳入我的函數這個數組,所以我可以使用它來執行很多代碼。VB:將二維數組傳遞給Sub

我的數組:

'generate Ingredient array 
Dim Ingredients(checkCount2 - 1, 3) As String 
Dim maxDim0 As Integer = UBound(Ingredients, 1) 
Dim maxDim1 As Integer = UBound(Ingredients, 2) 

我曾嘗試以下:

For i As Integer = 0 To maxDim0 
    For j As Integer = 0 To maxDim1 
     GenerateNewImport(Ingredients(i, j), F_IDCode, F_Description, F_VersionDate, F_VersionNumber) 
    Next j 
Next i 

OR

GenerateNewImport(Ingredients, F_IDCode, F_Description, F_VersionDate, F_VersionNumber) 

OR

GenerateNewImport(Ingredients(), F_IDCode, F_Description, F_VersionDate, F_VersionNumber) 

OR

GenerateNewImport(Ingredients(checkCount2-1, 3), F_IDCode, F_Description, F_VersionDate, F_VersionNumber) 

和等,但我不斷收到這樣的錯誤:

(Ingredients, ... : Value of type '2-dimensional array of String' cannot be converted to '1-dimension 

和等

我的功能是:

Sub GenerateNewImport(ByVal Ingredients(,) As String, ByVal F_IDCode As String, ByVal F_Description As String, ByVal F_VersionDate As String, ByVal F_VersionNumber As String) 

End Sub 

如何通過任何建議我數組放入函數調用?

下面引用和其他許多人:

https://msdn.microsoft.com/en-us/library/5dk93f6e(v=vs.90).aspx

+1

'GenerateNewImport(Ingredients,F_IDCode,F_Description,F_VersionDate,F_VersionNumber)'在我的測試用例中工作。 – Misery

+0

對不起,這個方法'Sub GenerateNewImport'(ByVal Ingredients(,)As String,ByVal F_IDCode As String,ByVal F_Description As String,ByVal F_VersionDate As String,ByVal F_VersionNumber As String)''''可以使用你的一個例子'GenerateNewImport成分,F_IDCode,F_Description,F_VersionDate,F_VersionNumber)'......實際問題是什麼? – djv

+0

@Verdolino問題是我無法通過我的函數內我的數組。它給我提到的錯誤。 Romulus001回答了我的問題。問題是我的函數本身沒有正確檢查我的二維數組,雖然我正在使用'GenerateNewImport(Ingredients,..)'正確傳遞它' – narue1992

回答

1
ByVal Ingredients(,) As String 

必須換成

ByRef Ingredients As String(,) 

編輯:我替換的關鍵字BYVAL通過爲ByRef

+2

這與我的測試項目 –

+0

的工作方式相同,這解決了我的錯誤。所以現在我可以在函數調用中調用'Ingredients,...'就好了。謝謝!我不喜歡2D陣列,所以感覺很蠢,我錯過了這個 – narue1992

+0

@ narue1992:剛剛編輯我的帖子,傳遞一個數組作爲參數(或對象),最好使用關鍵字** ByRef ** – romulus001

1

你說你嘗試調用

Sub GenerateNewImport(ByVal Ingredients(,) As String, ByVal F_IDCode As String, ByVal F_Description As String, ByVal F_VersionDate As String, ByVal F_VersionNumber As String) 

End Sub 

與此代碼

GenerateNewImport(Ingredients, F_IDCode, F_Description, F_VersionDate, F_VersionNumber) 

,但該組合實際上是正確的。接受的答案必須處理將簽名從Ingredients(,) As String更改爲Ingredients As String(,)並使用ByRef,因爲它是一個數組。但是,無論如何,數組都是作爲引用類型傳遞的,所以這是無關緊要的。在任何一種情況下,(,)的位置都是相同的

下面是一個簡單示例,顯示如何將多維數組傳遞給方法,並且您首先沒有問題。

Option Explicit On 
Option Strict On 

Module Module1 

    Sub Main() 
     Dim ingredients(1, 1) As String 
     ingredients(0, 0) = "a" 
     ingredients(0, 1) = "b" 
     ingredients(1, 0) = "c" 
     ingredients(1, 1) = "d" 
     Signature1(ingredients) 
     Signature2(ingredients) 
     Signature3(ingredients) 
     Signature4(ingredients) 
     For i As Integer = ingredients.GetLowerBound(0) To ingredients.GetUpperBound(0) 
      For j As Integer = ingredients.GetLowerBound(1) To ingredients.GetUpperBound(1) 
       Console.WriteLine(ingredients(i, j)) 
      Next 
     Next 
     Console.ReadLine() 
    End Sub 

    Sub Signature1(ByVal ingredients As String(,)) 
     ingredients(0, 0) = UCase(ingredients(0, 0)) 
     Console.WriteLine("You called Signature1") 
    End Sub 

    Sub Signature2(ByVal ingredients(,) As String) 
     ingredients(0, 1) = UCase(ingredients(0, 1)) 
     Console.WriteLine("You called Signature2") 
    End Sub 

    Sub Signature3(ByRef ingredients As String(,)) 
     ingredients(1, 0) = UCase(ingredients(1, 0)) 
     Console.WriteLine("You called Signature3") 
    End Sub 

    Sub Signature4(ByRef ingredients(,) As String) 
     ingredients(1, 1) = UCase(ingredients(1, 1)) 
     Console.WriteLine("You called Signature4") 
    End Sub 

End Module 

與輸出顯示,所有的簽名都是等價的,並且都經過ByRef

你叫Signature1
你叫簽名2
你叫Signature3
你叫Signature4
一個
B
C
D

+0

我不是意識到我的實際功能是問題。這就是我接受第一個答案的原因。然而,我很高興意識到我的實際功能調用是正確的。謝謝你的例子。設置的例子確實有幫助。 – narue1992