[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/10/05(Tue) 18:41
投稿者名:TM
Eメール:
URL :
タイトル:
配列の値と個数を引数として
No.384ではお世話になりました。
解決したので、しばらくこなかったため
よねKENさんの追記を無視した形になってしまい申し訳ございません。
分かりやすい説明ありがとうございました。

標記の件ですが、たとえば
Private Sub AAA()
  Dim a(2) As Integer
  a(0) = 1
  a(1) = 2
  a(2) = 3
  Call BBB(2, a(0))
End Sub

Private Sub BBB(b As Integer, c As Variant)
  Dim i As Integer
  For i = 0 To b
    Call MsgBox(c(i))
  Next i
End Sub

実行結果:
1
2
3

のようなことをやりたいのです。
つまり、配列の個数と、配列の最初の値を引数で渡すと、
その個数分のデータを参照できる関数を作りたいのですが、
当然のことながらcに1が代入されるだけなので
上記ではエラーになってしまいます。

Call BBB(a)
Private Sub BBB(d() As Integer)
とすれば配列で渡せるのは知っているのですが、
既存の通信パッケージの関数が上記の形となっていて
そのボードがない時のシミュレーションを行いたいため、
引数の形を同じにしなければなりません。
パッケージがやっているので、できないことはないのでしょうが、
私には方法がわかりません。よろしくお願いします。

投稿時間:2004/10/05(Tue) 18:51
投稿者名:kamurin
Eメール:kamurin@hotmail.com
URL :
タイトル:
Re: 配列の値と個数を引数として
試していないので、出来ないかも知れませんが、
考え方としては、
引数に変数(配列)のアドレスを渡して、
関数内で1配列分ずつアドレスを移動させて参照で出来れば、
良いと思います。

投稿時間:2004/10/05(Tue) 23:29
投稿者名:YAS
Eメール:yasunari@sakai.atnifty.com
URL :
タイトル:
Re: 配列の値と個数を引数として
TMさんこんにちは。
配列をポインタで渡しているようなので,以下のようになると思います。
BBBでは必要なメモリを配列で確保して,APIでコピーしています。

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub AAA()
  Dim a(2) As Integer
  a(0) = 1
  a(1) = 2
  a(2) = 3
  Call BBB(2, a(0))
End Sub

Private Sub BBB(b As Integer, c As Integer)
  Dim a() As Integer
  ReDim a(b)
  Call CopyMemory(a(0), c, LenB(c) * (b + 1))
  Dim i As Integer
  For i = 0 To b
     Call MsgBox(a(i))
  Next i
End Sub

投稿時間:2004/10/06(Wed) 16:40
投稿者名:TM
Eメール:
URL :
タイトル:
Re^2: 配列の値と個数を引数として
すんなり目的の事ができました。
ありがとうございました。