tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル関数に多次元配列のアドレスを渡す
記事No12018
投稿日: 2008/04/15(Tue) 20:11
投稿者えびな
こんにちは。開発環境はVB6です。
関数に多次元配列のアドレスを渡したいと思っています。

関数定義と呼び方は以下のようになっています。

関数定義
Public Function FuncA(ByRef dst() As Long) As Integer

呼び側
dim data(0 to 3)
result = FuncA(data)

関数の処理としては先頭アドレスを受けて
0-3の要素に値を格納します。

この場合はうまく行きますが、C言語のように
多次元配列の任意の列先頭を渡すことができないかと思っています。
dim data(0 to 6, 0 to 3)
result = FuncA(data(1))

格納先は1次元の場合もあれば,多次元の場合もあるため
関数定義は共通で行けないかと思っています。
どなたかお助け願います

[ツリー表示へ]
タイトルRe: 関数に多次元配列のアドレスを渡す
記事No12019
投稿日: 2008/04/16(Wed) 09:15
投稿者K.J.K.
それは間違った方向に向かっているような。

先頭要素のアドレスを渡したいのならば、

A,「アドレス」として用いたい場合、
関数定義
Function FuncA(ByVal Address As Long) As Integer
呼び出し側
result = FuncA(VarPtr(data(0))) '1次元
result = FuncA(VarPtr(data(0, 0))) '2次元

B, 参照渡しする場合、
関数定義
Function FuncA(ByRef dst As Long) As Integer
呼び出し側
result = FuncA(data(0)) '1次元
result = FuncA(data(0, 0)) '2次元

ということになってしまいます。
呼ばれた関数側からは配列として扱えませんよね。

それよりは、現在の関数の定義を維持したままで、その関数の中で
引数の次元数を得て、その数に応じて内部処理を変えるようにすべき
でしょう。

# もっといえば、異なる次元数のデータは異なる関数に渡るような
# 処理に置き換えるべきかと。

[ツリー表示へ]
タイトルRe^2: 関数に多次元配列のアドレスを渡す
記事No12021
投稿日: 2008/04/16(Wed) 10:00
投稿者えびな
御回答有難うございます。

次元別の関数を用意したり、引数「index」を
設けたりすることも考えましたが可能であれば
Cのようにアドレスを渡して処理を1つにしたいと思っております。

VarPtrは初めて知りました。

配列をary1(a), ary2(x,a), ary3(x,y,a)....
とするとaを最下位要素(というのでしょうか?)
と呼ばせていただきます。

仕様を伝え切れていませんで申し訳ありません。
上位要素の構成や要素数は可変ですが、最下位要素数は固定です。
また要素のデータ型はlongです。
やりたいことは最下位要素の先頭アドレスを渡しての、
最下位要素のデータ処理です。

Dim data(0 to 6, 0 to 3) as long
result = FuncA(VarPtr(data(1, 0)))

で最下位要素の先頭(1,0)のアドレスを渡された関数が
(1,0)のデータや続く(1,1),(1,2),(1,3)のデータを参照/操作することは
可能でしょうか?

[ツリー表示へ]
タイトルRe: 関数に多次元配列のアドレスを渡す
記事No12027
投稿日: 2008/04/16(Wed) 11:47
投稿者K.J.K.
> Dim data(0 to 6, 0 to 3) as long
> result = FuncA(VarPtr(data(1, 0)))
>
> で最下位要素の先頭(1,0)のアドレスを渡された関数が
> (1,0)のデータや続く(1,1),(1,2),(1,3)のデータを参照/操作することは
> 可能でしょうか?

API関数を使うなどして無理矢理やることは可能ですが、VB6の言語仕様としては
無理なことですし、そうすべきではないことでしょう。

別の掲示板でも、関連のありそうな質問の投稿が最近あって、そちらでも
書いたのですが、VB6にはポインタのキャストという概念がありません。
ですから、やはり仕様を見直すのが無難なところでしょう。

どうしてもそうしたいのであれば、先ほど他所で書いた
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200804/08040024.txt
のコードを応用するなどして下さい。

[ツリー表示へ]
タイトルRe^2: 関数に多次元配列のアドレスを渡す
記事No12028
投稿日: 2008/04/16(Wed) 12:00
投稿者えびな
回答有難うございます。
解りました。今回はあきらめて煩雑な構成で処理します。
ちなみに今回はやらないのですが、VB6以降にはポインタ的に
使えるものが存在するのでしょうか?

[ツリー表示へ]
タイトルRe: 関数に多次元配列のアドレスを渡す
記事No12030
投稿日: 2008/04/16(Wed) 15:09
投稿者K.J.K.
> VB6以降にはポインタ的に使えるものが存在するのでしょうか?

おそらく存在しないものと思われます。Marshalを使っていろいろ
する手もありますが、Cでポインタを使うのとはかなり異なりますし。

[ツリー表示へ]
タイトルRe^2: 関数に多次元配列のアドレスを渡す
記事No12031
投稿日: 2008/04/16(Wed) 15:29
投稿者えびな
いろいろとご教授いただき有難うございました。

[ツリー表示へ]