開発環境
Visual Basic6.0 (Microsoft Office Excel 2003)
OS WindowsXP SP2
最終的にはExcelのマクロで宣言したDouble型多次元配列を
VC++で作成したDLLに渡したいのですが、多段階配列の宣言の
仕方が分かりません。どなたか教えて頂けませんでしょうか?
VB .NET では、以下のように宣言できますが
Dim D1()() As Double
D1 = New Double(2)(){}
D1(0) = New Double(){ 20, 39 }
D1(1) = New Double(){ 1, 2, 3, 4 }
D1(2) = New Double(2){}
Excelのマクロ(VB6.0)では、
Dim D1()() As Double
これで構文エラーが出てしまいます。
何かやり方があるのでしょうか?
VB6はどうかわかりませんが、VC側でDLLを作成する時に
多段階配列として受け取れないと思われます。
(SAFEARRAYまたはCとしての2次元配列としてデータをもてない、必ずn×mの形になる)
> VB6はどうかわかりませんが、VC側でDLLを作成する時に
> 多段階配列として受け取れないと思われます。
誤爆っぽい。。。
SafeArrayCreate関数にVT_ARRAY設定できるかもしれんし。。。
結局のところ一番重要なのはVCとのインタフェースをどうするかになると思います。
多段階配列にすると、必ずCの知識が必要です。(結構ムズめ)
固定の2次元配列ならば、案外楽ちんにできます。
> SafeArrayCreate関数にVT_ARRAY設定できるかもしれんし。。。
Neither the VT_ARRAY nor the VT_BYREF flag can be set. とMSDNにありました。
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/automat/htm/chap7_1rvp.asp
ここまでは、VBに関係ない話なので、無視しといてください。
多段階配列でなく、2次元配列ならば
Dim a( 10, 10 ) As Double
で10×10
動的にとるならば
Dim a() As Double
ReDim a( 10, 10 )
みたいに出来ます。
Blue様
何回もご丁寧に回答頂き、ありがとうございます。
やっぱり、互換を取るのは本当に難しいですね。
VC側では、動的に配列を確保したくてmallocを
使用しています。これは多段階配列という認識で
合っていますよね…。(多段階配列、まだ勉強不
足なんです。すみません。)
教えていただいたSafeArrayCreateと、インタ
フェース等を再検討してみます。
仮に多次元配列だとして、VB側で確保された領域に対しての操作でしたら、
配列のサイズと、先頭の要素を渡してあげれば、そんなに難しいことはないです。
(double*型で処理しようと思えばできると思う)
しかし、C側でVBがつかう領域を確保して、値等を設定して返すには工夫が必要です。
(Cでmallocした領域はVB側では使えない。)
いまさらですが、
> VB6はどうかわかりませんが、VC側でDLLを作成する時に
> 多段階配列として受け取れないと思われます。
VB6で、
Dim a() As Variant
Dim b() As Variant
ReDim a(5)
a(0) = Array(1, 2, 3, 4)
a(1) = Array(1, 2, 3, 4, 5)
ReDim b(6)
a(2) = b
で多段階配列として扱えることが出来ました。(質問に答えた時は知識不足でした。)
よって、VC側も VARIANT型で受け取れると思います。