tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル配列の値のコピー方法を知りたい
記事No9317
投稿日: 2009/08/30(Sun) 09:46
投稿者ほげげ
今までVB6を使用していてVB.netは全く初心者で参考書を片手に
今回初めて作っています。
配列の値のコピー方法が判らなくて質問させていただきます

目的は2次元配列[B]の値の一部を1次元配列[A]に格納することです。
(それぞれPublic)

以下のようにすると「NullExceptionはハンドルされませんでした」
となってしまいエラーメッセージの内容も理解できません。
本で調べて、「.Clone」をつけてみたりもしましたが、
エラーメッセージの内容も変わりません。
どなたかご助言いただけますでしょうか?

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim i As Integer

        For i = 0 To 10
            A(i) = B(i)(0)
        Next

    End Sub

[ツリー表示へ]
タイトルRe: 配列の値のコピー方法を知りたい
記事No9318
投稿日: 2009/08/30(Sun) 12:52
投稿者ナナシー
エラーの内容からして、配列Aがきちんと初期化されていないケースが考えられますね。

VB.netでは配列の長さはきちんと宣言してあげなければいけません。
また、一度宣言した長さを変更することも出来ますが、その場合も明示的に設定をしてあげる必要があります。

配列の長さが必ず11個で固定ならば、Aの宣言部分で

        Dim A(10) As Integer

で動くはずです。

要素数が不確定であるならば、代入時に配列の長さを確保します。

        Dim ii As Integer

        For ii = 0 To 10
            ' 要素数を確保する
            If a Is Nothing Then
                ' 配列が初期化されていない場合
                ReDim a(0)
            Else
                ' 配列が初期化済なら要素を追加
                ReDim Preserve a(a.Length)
            End If

            ' 代入
            a(a.Length - 1) = b(ii, 0)
        Next

のように、代入する時点できちんと配列の長さを変えてあげる必要があります。


あと、最近VBから遠ざかっているので、自信ないのですが・・・。
    B(i)(0)
で、参照できましたっけ?たしか
    B(i, 0)
でないといけなかったような気が・・・。
勘違いだったらごめんなさい。

[ツリー表示へ]
タイトルRe^2: 配列の値のコピー方法を知りたい
記事No9319
投稿日: 2009/08/30(Sun) 13:50
投稿者ほげげ
ありがとうございます。
確かに配列の初期化の問題のようでした。
エラーメッセージが不親切すぎて理解できず二晩悩んでしまいました。

VB6の時は配列の初期化を意識する必要はなかったのですがVB.netは
初期化が必要なんですね。
NothigやReDimもいまいち理解できていませんしもうすこし勉強しなくては、、

ちなみにVB6はB(i, 0)の参照のしかたですが.netはB(i)(0)でないと
エラーになってしまうようです。

[ツリー表示へ]
タイトル多次元配列と多段階配列
記事No9320
投稿日: 2009/08/30(Sun) 17:08
投稿者ダンボ
> ちなみにVB6はB(i, 0)の参照のしかたですが.netはB(i)(0)でないと
> エラーになってしまうようです。

エラーはまた別な原因でしょう。

http://msdn.microsoft.com/ja-jp/library/dd314345.aspx
添え字を複数もつ、いわゆる 「多次元」 の配列には、「多次元配列」 と 「多段階配列」 の 2 つがある点です。この点については、3-3-5 「多次元配列」、および 3-3-6 「多段階配列」で説明します。
1:  Tbl(3,4)  = 100  //多次元配列
2:  Dat(3)(4) = 200  //多段階配列

[ツリー表示へ]
タイトルRe: 多次元配列と多段階配列
記事No9321
投稿日: 2009/08/30(Sun) 18:29
投稿者ほげげ
ダンボ様

おっしゃるとおりですね。
参考書で多次元配列のところで導入で不定形を使用していたので
そのままこれが二次元配列の表現だと思い込んでいました。

エラーが出ていた理由はもちろん初めの宣言のところで
不定形配列で定義しているからです。(汗)

何も知らないでvb.netを新たに始めると思い込みで
突っ走ってしまって謎のエラーで止まってしまって苦労していますが。
vb6を初めて使った学生の頃の気持ちに戻って一から勉強しています。

それにしてもvb6は今時外部アプリと連携が取れませんから
そろそろ.netに移行するかと思って勉強始めましたが
メソッドとか、年寄りの頭にはなかなか理解できなくて苦労しています。

[ツリー表示へ]
タイトルRe^3: 配列の値のコピー方法を知りたい
記事No9323
投稿日: 2009/08/31(Mon) 09:26
投稿者よねKEN
> VB6の時は配列の初期化を意識する必要はなかったのですがVB.netは
> 初期化が必要なんですね。

そこはVB6でもVB.netでも変わってませんよ。

[VB6]
(1)
Dim A() As Integer
Redim A(10)           ' 動的に配列の要素数を決めてメモリを確保

(2)
Dim A(10) As Integer  ' 宣言時点で配列の要素数を決めてメモリを確保

[VB.net]
(1)
Dim A() As Integer
Redim A(10)           ' 動的に配列の要素数を決めてメモリを確保

(1)'
Dim A() As Integer
A = New Integer(10){} ' 「動的に配列の要素数を決めてメモリを確保」の.NETらしい書き方

(2)
Dim A(10) As Integer  ' 宣言時点で配列の要素数を決めてメモリを確保

配列の要素数分のメモリ確保はVB6でもVB.netでも必要です。

[ツリー表示へ]