- 題名: 1次元配列の引数に2次元配列を渡したい
- 日時: 2009/03/12 18:13:51
- ID: 24179
- この記事の返信元:
- (なし)
- この記事への返信:
- [24181] Re[1]: 1次元配列の引数に2次元配列を渡したい2009/03/12 19:01:22
- ツリーを表示
素早い回答感謝いたします。 「ジャグ配列」について、これから調査してみます。 要素数の間違いはうっかりでした。失礼しました。 ありがとうございます。
みなさん、色々アドバイスありがとうございます。 ジャグ配列でやりたいのですが、うまくできていません。 (テストコードを書いてみて要素数固定でジャグ配列の使い方は理解できました) 実は1次元配列側の要素数、その配列の個数(要素数)共に 動的に変えたいのです。 Redimで変更できるのは配列の個数(要素数)だけのようで Redim(m)()はできますが、Redim(m)(n)のように書けません。 C言語で2次元配列の一部を渡したいときはポインタで簡単に できるので、VB.netでも良い方法があるように思うのですが。
> Redimで変更できるのは配列の個数(要素数)だけのようで
> Redim(m)()はできますが、Redim(m)(n)のように書けません。
ジャグ配列は、配列内の配列をそれぞれ初期化する必要があります。
New を使って初期化してください。
Dim a(m)()
For i As Byte= 0 To m
a(i) = New Byte(n) { }
Next
> C言語で2次元配列の一部を渡したいときはポインタで簡単に
> できるので、VB.netでも良い方法があるように思うのですが。
VB は C 言語ではないので。
■No24190に返信(ひで46さんの記事)
> (テストコードを書いてみて要素数固定でジャグ配列の使い方は理解できました)
あれ? 要素数固定の配列は、VB.NET では作れないと思いますが…。
(VB6 や C# であれば作れますが)
次元数は固定的ですが、要素数は常に動的に変化させられるはず。
現在は、どのようなコードを書いているのでしょうか?
> 実は1次元配列側の要素数、その配列の個数(要素数)共に
> 動的に変えたいのです。
List(Of Byte())、または List(Of List(Of Byte)) で管理するという手も。
> Redimで変更できるのは配列の個数(要素数)だけのようで
> Redim(m)()はできますが、Redim(m)(n)のように書けません。
Module Module1
Sub Main()
Dim a()() As Byte = { _
New Byte() {1, 2, 3}, _
New Byte() {4, 5}, _
New Byte() {6, 7, 8, 9} _
}
Dump(a)
ReDim Preserve a(6)
a(3) = New Byte() {}
a(5) = New Byte() {15, 31, 63, 127, 255}
ReDim a(6)(2)
a(6)(0) = 1
a(6)(1) = 5
a(6)(2) = 3
Dump(a)
ReDim Preserve a(1)(3)
a(1)(3) = 255
Dump(a)
Console.ReadKey()
End Sub
Sub Dump(ByVal o()() As Byte)
For n As Integer = 0 To UBound(o)
Console.Write("{0}:", n)
Dim item() As Byte = o(n)
If item Is Nothing Then
Console.WriteLine("(null)")
Else
Console.WriteLine(BitConverter.ToString(item))
End If
Next
Console.WriteLine("---------")
End Sub
End Module
ありがとうございます。
色々試行錯誤しまして、
Redim a(m) '配列の個数を変更
ReDim Ary(n) '次元配列の要素数を変更
For i = 0 To m 'このループで要素数nの1次元配列をm個用意
a(i) = Ary.Clone
Next
という処理を考えましたが、Hongliangさんの方式が良いですね。
ジャグ配列を使ってもこのような形にするしかないことが分かりました。
とりあえず、これで前に進めます。ありがとうございました。
魔界の仮面弁士さん、いつもすばらしい回答を拝見しております。 投稿タイミングが重なってしまったようで、失礼しました。 > あれ? 要素数固定の配列は、VB.NET では作れないと思いますが…。 > (VB6 や C# であれば作れますが) すいません。要素数固定という表現がまずかったです。 コード中の初期化で要素を入れるという動作が確認できたという意味です。 私がやりたかったのはまさに、Hongliangの示して頂いたコードでした。
分類:[.NET]