2016-11-14 4 views
-1

私は、()内のサイズが静的ではない2D配列を持っています。コードは後でサイズを割り当てます。私はこの配列に関数を渡したいので、それを使ってたくさんのコードを実行できます。VB:2D配列を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 

となど

My機能は次のとおりです。

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は文字列、ByVal F_Descriptionは文字列、ByVal F_VersionDateは文字列、ByVal F_VersionNumberはString)'は、あなたの例の1つ、 'GenerateNewImport成分、F_IDCode、F_Description、F_VersionDate、F_VersionNumber) '...実際の問題は何でしたか? – djv

+0

@Verdolino問題は私の機能の中で私の配列を渡すことができませんでした。それは私が言及したエラーを与えた。 Romulus001が私の質問に答えました。問題は私の関数自体が 'GenerateNewImport(Ingredients、..) 'を使って正しく渡していても正しく2D配列をチェックしていないということでした。 – narue1992

答えて

1
ByVal Ingredients(,) As String 

はに

ByRef Ingredients As String(,) 

EDITに置き換えられました:私は、キーワードのByValを置き換え

ByRefの によって
+2

私のテストプロジェクトで同じことをします –

+0

これは私のエラーを修正しました。だから私は 'Ingredients、... 'と呼ぶことができます。ありがとうございました!私は2D配列ではうまくいきませんでしたので、私はこれを逃したばかげて感じました – narue1992

+0

@ narue1992:パラメータ(またはオブジェクト)として配列を渡すために、私の投稿を編集しただけで、キーワード** ByRef ** – romulus001

1

あなたはこのコード

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

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 

を呼び出そうとしましたが、その組み合わせが実際に正しいと述べました。受け入れられる答えは、Ingredients(,) As StringからIngredients As String(,)への署名の変更と、それが配列なのでByRefを使用して処理しなければなりません。しかし、配列は参照型として渡されますので、これは重要ではありません。いずれの場合も(,)の配置は同じです

ここでは、多次元配列をメソッドに渡す方法と、最初は問題がないことを示す簡単な例を示します。出力は、すべての署名が等価であることを示し、およびすべての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 

あなたは、あなたがSignature4
A と呼ばSignature3
と呼ばsignature2の
と呼ばSignature1
と呼ばれます
B
C
D

+0

私の実際の機能が問題であることを認識しました。それが私が最初の答えを受け入れた理由です。しかし、私の実際の関数呼び出しが正しいことを知ってうれしかったです。あなたの例もありがとう。設定例は役に立ちます。 – narue1992