2次元配列から1次元配列への変換(抽出?)方法について

タグの編集
投稿者 あーれー  (学生) 投稿日時 2008/12/26 23:05:34
VisualBasic2005でプログラムの勉強をしてるプログラム初心者です。

2次元の配列を1次元に変換したいのですが、やり方がわからないので、
教えていただけないでしょうか。
よろしくお願いします。

●のところで『オブジェクト参照がオブジェクト インスタンスに設定されていません。』となってしまいます。

        Dim Students(3, 30) As String

        Students(0, 0) = "相原"
        Students(0, 1) = "赤井"
        Students(0, 2) = "井口"
        Students(3, 30) = "渡良瀬"

        Dim student() As String
        Dim st As String
        For Each st In Students
            For i As Integer = 0 To Students.Length - 1
               ● student(i) = st ●
            Next
        Next
投稿者 るしぇ  (社会人) 投稿日時 2008/12/26 23:27:09
>Dim student() As String
これだと配列の先頭アドレスを決めただけで、いくつデータの部屋を
確保するか決めてない為、データを入れられる部屋が無い状態です。
具体的な配列の長さを指定してください。
Dim student(Students.Length - 1) As String
とか?

。。。ただ、ループの条件もなんか変な気がしますが。。。
i を 0 から Students.Length - 1 まで何回かまわすの?
投稿者 あーれー  (学生) 投稿日時 2008/12/26 23:56:12
るしぇさん返答ありがとうございます。

配列は先に長さを指定しないといけないんですね。
ものすごく基礎的なことがわかっておらず、すいません。

Students配列のデータを、データもないものも含めてすべて
student配列にしたいのですが、これじゃあ駄目ですか?

students.lengthが124なのでfor文で124回(・・・あっ、-1いらないですね。)
student(i) = st
を行い、124個のデータを持った
student配列を作ろうとしたつもりでした。

Dim student(Students.Length) As String

作り直してみると、全データが渡良瀬になってるようです。

かなりしょぼい内容ですが、ご教授願いたいと思います。
よろしくお願いします。
投稿者 neptune  (社会人) 投稿日時 2008/12/27 00:09:43
こんにちは

最初のソースの通りなら
iの値の変化をステップ実行してみてみましょう。

>For i As Integer = 0 To Students.Length - 1
がまずいことが判ると思います。
iをfor文が実行される度に初期化されてますからね。
投稿者 あーれー  (学生) 投稿日時 2008/12/27 00:28:26
こんにちは、neptuneさん。返答ありがとうございます。

ステップ実行、初級講座の第41回を参考に行ってみました。
いろいろな変数の変化を確認することができるんですね。すごい!

今後どんどん使いたいと思います。
投稿者 るしぇ  (社会人) 投稿日時 2008/12/27 20:34:45
For Each は順番を気にしなくて良いときのみに
使うほうが良いです。
        Dim Students(3, 30) As String
        Students(0, 0) = "相原"
        Students(0, 1) = "赤井"
        Students(0, 2) = "井口"
        Students(0, 3) = "0,3"
        Students(0, 30) = "0,30"
        Students(1, 0) = "1,0"
        Students(1, 30) = "1,30"
        Students(2, 0) = "2,0"
        Students(3, 30) = "渡良瀬"
        Dim student(Students.Length - 1) As String
        For i As Integer = 0 To Students.GetLength(0) - 1
            For j As Integer = 0 To Students.GetLength(1) - 1
                student(i * Students.GetLength(1) + j) = Students(i, j)
            Next
        Next
投稿者 あーれー  (学生) 投稿日時 2009/1/5 22:18:56
るしぇさん。ありがとうございます。

るしぇさんのおっしゃるとおり、For Each は順番を気にしなくて良いときのみに
使うことにします。