tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル配列に関して教えてください><
記事No10372
投稿日: 2010/12/18(Sat) 13:46
投稿者PAO
いつもお世話になっておりますPAOです。
今回もこのド素人にご教授お願いいたします><
今回ぶち当たってるのは配列に関してです><

今自分なりにこんなプログラムを作っています
Public Class Form3
    Dim atmX(5) As String
    Dim atmY(5) As String
    Private ss As String
    Private cc As String
    Dim muneX(5) As String
    Dim muneY(5) As String
Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
        ss = atmX(5)
        cc = atmY(5)
    End Sub
    Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
        ss = muneX(5)
        cc = muneY(5)
    End Sub
    Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        Dim XX As Integer
        Dim YY As Integer
        XX = e.X
        YY = e.Y
        ss = XX
        cc = YY
    End Sub
End Class

まぁここでなにをしようかと言いますと・・・
ピクチャーボックスに出ている画像の座標を格納するために
配列を使おうと考えています
RadioButton1をチェックすると頭の位置の座標を
RadioButton2をチェックすると胸の位置の座標を
格納できるようにしたいと考えています
んでそこから格納されている座標を読みとったりしていきたいと考えているのですが
まぁここの時点で行き詰っているわけで
うまく格納されていないようで・・・
多分自分が配列に関してわかっていないからこんな風になっていると
思うのですが・・・どなたかご教授お願いいたします><

[ツリー表示へ]
タイトルRe: 配列に関して教えてください><
記事No10373
投稿日: 2010/12/18(Sat) 14:37
投稿者魔界の仮面弁士
> Private Sub PictureBox1_MouseDown(…) Handles PictureBox1.MouseDown
>     Dim XX As Integer
>     Dim YY As Integer
>     XX = e.X
>     YY = e.Y
>     ss = XX
>     cc = YY
> End Sub
これって、要するに
  Private Sub PictureBox1_MouseDown(…) Handles PictureBox1.MouseDown
      ss = CStr(e.X)
      cc = CStr(e.Y)
  End Sub
と同じ意味ですね。


> Private Sub RadioButton1_CheckedChanged(…) Handles RadioButton1.CheckedChanged
>     ss = atmX(5)
>     cc = atmY(5)
> End Sub
atmX(5) の中身を ss や cc に取り出しても、中身は空っぽのままだと思いますよ。
atmX(5) に値をセットしている箇所が無いのですから。

その逆に、
  atmX(5) = ss
とするのであれば、MouseDown で得た座標を配列にセットできますが、
そもそも何のために配列にしているのか、コードの意図を読み取れませんでした。

atmX(0)〜atmX(4) は、どこで利用されるのでしょうか?


> RadioButton2をチェックすると胸の位置の座標を
> 格納できるようにしたいと考えています
MouseDown 後に RadioButton をチェックするのでしょうか。
それとも、チェックした後で MouseDown するのでしょうか。
それによって、MouseDown 時のコードも変わってくるかと思います。

[ツリー表示へ]
タイトルRe^2: 配列に関して教えてください><
記事No10374
投稿日: 2010/12/18(Sat) 15:03
投稿者PAO


> atmX(5) の中身を ss や cc に取り出しても、中身は空っぽのままだと思いますよ。
> atmX(5) に値をセットしている箇所が無いのですから。
> その逆に、
>   atmX(5) = ss
> とするのであれば、MouseDown で得た座標を配列にセットできますが、
> そもそも何のために配列にしているのか、コードの意図を読み取れませんでした。
> atmX(0)〜atmX(4) は、どこで利用されるのでしょうか?
私は今人の動きの解析するプログラムを作っていまして
動画をフレームごとに分けて画像データにしそれをTimerなどを使い
連続でピクチャーボックスに表示させ動画のように見せているのですが
そこで頭の動きをクリックで座標を取得していくので
配列で格納して行こうと思い使いました


> > RadioButton2をチェックすると胸の位置の座標を
> > 格納できるようにしたいと考えています
> MouseDown 後に RadioButton をチェックするのでしょうか。
> それとも、チェックした後で MouseDown するのでしょうか。
> それによって、MouseDown 時のコードも変わってくるかと思います。
これはMouseDown前にチェックです

[ツリー表示へ]
タイトルRe^3: 配列に関して教えてください><
記事No10375
投稿日: 2010/12/18(Sat) 15:16
投稿者魔界の仮面弁士
> 連続でピクチャーボックスに表示させ動画のように見せているのですが
> そこで頭の動きをクリックで座標を取得していくので
> 配列で格納して行こうと思い使いました
まだ良く分かりません。

配列の要素数が 6 個(0〜5)に固定されているのは何故でしょうか?
提示されていたサンプルで、要素 5 を固定で使っているのには、何か理由がありますか?
配列のほかに、List/Queue/Stack の利用は検討されましたか?


> これはMouseDown前にチェックです
であれば、クリック時の処理に問題がありそうです。

現在の MouseDown イベント内の処理は
  ss や cc に、MouseDown 時の座標を記録
となっていますが、これを
  RadioButton1 が選択されていたら、atmX  や atmY  に座標を記録
  RadioButton2 が選択されていたら、muneX や muneY に座標を記録
という If 文での処理に直してみてください。

[ツリー表示へ]
タイトルRe^4: 配列に関して教えてください><
記事No10376
投稿日: 2010/12/18(Sat) 15:39
投稿者PAO
> 配列の要素数が 6 個(0〜5)に固定されているのは何故でしょうか?
> 提示されていたサンプルで、要素 5 を固定で使っているのには、何か理由がありますか?
> 配列のほかに、List/Queue/Stack の利用は検討されましたか?
固定の理由はまだテストという考えなので試しにやっている感じです
なのでちゃんとわかれば要素数は増やします

すいません><プログラムは初心者なので
List/Queue/Stackをまず知りませんでした><
なので今から調べて検討してみようと思います
List/Queue/Stackとはどういうものなのか
簡単でいいので教えていただけたら嬉しいです


>であれば、クリック時の処理に問題がありそうです。
>
> 現在の MouseDown イベント内の処理は
>   ss や cc に、MouseDown 時の座標を記録
> となっていますが、これを
>   RadioButton1 が選択されていたら、atmX  や atmY  に座標を記録
>   RadioButton2 が選択されていたら、muneX や muneY に座標を記録
> という If 文での処理に直してみてください。
なるほど!!参考になります!!

[ツリー表示へ]
タイトルRe^5: 配列に関して教えてください><
記事No10377
投稿日: 2010/12/18(Sat) 16:22
投稿者魔界の仮面弁士
> List/Queue/Stackをまず知りませんでした

配列の場合、最初に要素数を決定しておく必要がありますが、
これらのクラスでは要素数を可変にできるため、取り扱いが容易となります。

要素数や順番が固定的な場合には、配列で十分ですが、
事前に何個のデータを持つべきか分からないような場合や、
データの削除や挿入がある場合には、配列よりも便利かと思います。


> List/Queue/Stackとはどういうものなのか

これらは、複数のデータを蓄えておき、それを後で取り出すために使われる
「コレクション」系のクラスです。配列(Array)もコレクションの一種です。

Stack は、最後に入力したデータが先に出力されます(最初の入力は最後に出力される)。
Queue は、最初に入力したデータが先に出力されます(最後の入力は最後に出力される)。
List  は、任意の場所のデータを取り出せます。


スタックとは積み上げるという意味です。お皿を順々に上に重ねていった場合、
一番上のお皿から取り出していきますよね。いきなり下のお皿を取る事はできません。

キューとは、待ち行列の意味です。ラーメン屋の順番待ちの場合、
最初に並んだ人が先で、一番最後に並んだ人は最後になりますね。

リストは一覧表。これは配列とほぼ同じで、先に追加したか後に追加したかは関係なく、
N番目のデータを取り出せるようになっています。

------------
Dim s As New Stack(Of Integer)()
s.Push(1234)
s.Push(4567)
s.Push(6789)
s.Push(8901)
MsgBox(s.Pop())         '最後の「8901」が取り出される
MsgBox(s.Pop())         '「6789」が取り出される

Dim q As New Queue(Of Integer)()
q.Enqueue(111)
q.Enqueue(333)
q.Enqueue(555)
q.Enqueue(777)
MsgBox(q.Dequeue())     '最初の「111」が取り出される
MsgBox(q.Dequeue())     '「333」が取り出される

Dim l As New List(Of Integer)()
l.Add(1001)
l.Add(2002)
l.Add(3003)
l.Add(4004)
MsgBox(l(0))            '0番目の「1001」が取り出される
MsgBox(l(3))            '3番目の「4004」が取り出される

[ツリー表示へ]
タイトルRe^6: 配列に関して教えてください><
記事No10378
投稿日: 2010/12/20(Mon) 10:09
投稿者GOD
> 配列の場合、最初に要素数を決定しておく必要がありますが、
>
ちょっと誤解を招きそうなので。
最初というのは配列に値を代入する直前です。(「Redim」または「Redim Preserve」で配列のサイズを指定すれば可変になります。)

・動作的配列の参考HP
homepage1.nifty.com/rucio/main/dotnet/shokyu/standard27.htm

変数の宣言ですが、String型になっていますがなぜでしょう。

[ツリー表示へ]
タイトルRe^7: 配列に関して教えてください><
記事No10379
投稿日: 2010/12/20(Mon) 11:52
投稿者PAO
>変数の宣言ですが、String型になっていますがなぜでしょう。

自分もプログラムを作る上で参考書などを購入していまして
そこにはString型になっていましたので
そこはそのまま引用していました

やはりまずかったでしょうか?

[ツリー表示へ]
タイトルRe^7: 配列に関して教えてください><
記事No10380
投稿日: 2010/12/20(Mon) 12:48
投稿者魔界の仮面弁士
> 変数の宣言ですが、String型になっていますがなぜでしょう。
座標を管理するのですから、本来は Integer あるいは Point あたりが妥当でしょうね。


> 「Redim」または「Redim Preserve」で配列のサイズを指定すれば可変になります。
誤解を恐れずに言えば、VB.NET では配列の要素数を変更できません。

ReDim 後の配列は、実際には、以前の配列とは別のオブジェクトとして生成されます。

ReDim Preserve というのも、実際には配列の要素数を変更しているわけではなく、
新たなサイズの配列を新規に作成し、そこに元のデータをコピーするだけだったりします。


Dim a(1) As Integer
a(0) = 111
a(1) = 222

Dim b() As Integer
b = a            '配列の参照コピー
MsgBox(a(0))     '111 と表示される。
MsgBox(b(0))     '111 と表示される。
a(0) = 1000      'a 側の値を 111 → 1000 に変更
MsgBox(a(0))     '1000 に変更される。
MsgBox(b(0))     '1000 に変更される(同じ配列なので)。
b(1) = 2000      'b 側の値を 222 → 2000 に変更
MsgBox(a(1))     '2000 に変更される(同じ配列なので)。


ReDim Preserve a(2)   '実は新たな配列を作り直している
a(0) = 9999      '新規配列の値を 1000 → 9999 に変更
MsgBox(a(0))     '新規配列は 9999 に変更されているが
MsgBox(b(0))     '元の配列は 1000 のまま。

[ツリー表示へ]
タイトルRe^8: 配列に関して教えてください><
記事No10381
投稿日: 2010/12/20(Mon) 13:59
投稿者GOD
> ReDim 後の配列は、実際には、以前の配列とは別のオブジェクトとして生成されます。
>
これは知らなかった。毎回別オブジェクトを作っていたとは...
Redim 時に連続した領域が確保できない場合のみ、別オブジェクトを取り直していると思っていました。.NET になってから変わってしまったんですね。

[ツリー表示へ]