- PR -

昔の VB で要素数 0 の配列を使いたい

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-27 13:00
引用:

unibonさんの書き込み (2005-12-27 11:27) より:

UBound が -1 なのは数え方の違いだけなので構いません(VB の流儀だと割り切ります)。


Option Base を触らないのであれば問題ないと思います。
LBound と UBound 両方見ていればもっと問題なさ気ですが、
まあ、普通は触らないですからね > Option Base

引用:

ただ、気づいたのですが、これを施した配列に対し、さらに ReDim Preserve はできないみたいですね。SafeArrayAllocDescriptor だけでは足りないのか、私が勘違いしているのか分かりませんが。


このあたりは、先によねKENさんが紹介してくださった、
魔界の仮面弁士さんの記事に書かれているかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-28 16:21
僕は、variant で逃げちゃいます。
そんなに厳密に使う場合って、どんな場合があるんですか?

コード:

private 配列 as variant: 配列 = null
public sub 配列の末尾に追加(byval 文字列 as string)
    if (isnull(配列)) then
        redim 配列(0 to 0) as string
    else
        redim 配列(0 to ubound(配列) + 1)
    end if
    配列(ubound(配列)) = 文字列
end sub



この書き方で、別に不便を感じたことはないのですが。
型指定を厳密にさせて、要素を自由にいぢりたいとなると、僕なら、各型ごとに collection をラッピングしたクラスを作ります。
で動的に配列を生成して渡せるようにしておけば、純粋に配列として扱う場合でも問題ないように思いますが。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-12-29 20:47
いろいろやっているのですが、来年になってしまいそうなので、とりあえず経過報告です。まあ、今、こんなことやってるんだ、程度に読んでいただければと思います。

引用:

じゃんぬねっとさんの書き込み (2005-12-27 13:00) より:
引用:

ただ、気づいたのですが、これを施した配列に対し、さらに ReDim Preserve はできないみたいですね。SafeArrayAllocDescriptor だけでは足りないのか、私が勘違いしているのか分かりませんが。


このあたりは、先によねKENさんが紹介してくださった、
魔界の仮面弁士さんの記事に書かれているかと思います。


SafeArrayAllocDescriptor に加えて RtlMoveMemory による操作が必要らしいのですが、このやり方がまだ良く分かっていません。
ちょっと方針を変えて、Preserve はあきらめて、ReDim の時は常にヘルパー(ラッパー)の Sub/Function を呼んで、その中で要素数が0でないときにだけ Preserve しようかと思っています。こうすれば UBound = -1 だったらどのみち要素数が 0 なんだから Preserve なしで ReDim できます。
あと、これはあまりたいしたことではないのですが、気づいたこととしては、VB だと配列に多次元もあるので、これをどうすれば良いのかで、これも悩んでいます。たとえば ReDim (9, -1) に相当することをしたい時はどうすれば良いかなど。多次元配列を使わないようにすればそれで良いんですが、たまたま自分が作ったプログラムでは使っていたので、どうしようかなと思って。

引用:

R・田中一郎さんの書き込み (2005-12-28 16:21) より:
この書き方で、別に不便を感じたことはないのですが。
型指定を厳密にさせて、要素を自由にいぢりたいとなると、僕なら、各型ごとに collection をラッピングしたクラスを作ります。
で動的に配列を生成して渡せるようにしておけば、純粋に配列として扱う場合でも問題ないように思いますが。


たしかにご指摘のとおり、これででき、私も、いままでこれを含めて種々のワザでもう10年近くもずっとしのいで来たのですが、これが面倒なのです。私のコードの書き方だと、配列の要素に種々の Class を Set することが多くて、ラッパーだらけになってしまうのです。配列の確保の時ならラッパーを使ってもさほど煩雑にはならないのですが、配列の読み書きのアクセスをするたびにラッパーを経由するのはさすがにしんどくて。
また、型が使えないと、インテリセンスが使えないとか、で、デバッグしにくいし。

スキルアップ/キャリアアップ(JOB@IT)