Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[VB6] 1次元配列の要素数の取得方法

329 views
Skip to first unread message

tmk

unread,
Sep 8, 2006, 12:38:46 PM9/8/06
to
VB6で、一次元配列の要素数を高速に取得する方法を現在模索しております。

下記ソースのFunction ※1 なんですが、仕様は引数で渡された配列の要素数を返すように
したいわけなのですが、このFunctionはアプリ内の各部から非常に多く実行されるため、

On Error ステートメントをはずしたいと考えているのですが、良い方法はあるでしょうか・・
以上、よろしく御願いします。

Private Sub Command1_Click()
Dim str() As String
Debug.Print GetArrayCount(str()) 'この場合 0 が帰ってくるようしたい
End Sub

Private Sub Command2_Click()
Dim str(5) As String
Debug.Print GetArrayCount(str()) 'この場合 6 が帰ってくるようしたい
End Sub

Function GetArrayCount(strArray() As String) As Long
'※1
On Error Resume Next
GetArrayCount = UBound(strArray()) - LBound(strArray()) + 1
On Error GoTo 0
End Function

K.J.K.

unread,
Sep 8, 2006, 7:27:21 PM9/8/06
to
K.J.K.です。

"tmk" wrote in message
<#1PjAV20...@TK2MSFTNGP06.phx.gbl>
> VB6で、一次元配列の要素数を高速に取得する方法を現在模索しております。

高速であるかどうかは知りませんが、

Private Declare Sub CopyMemoryFromArray _
Lib "kernel32.dll" Alias "RtlMoveMemory" _
(DestinationPointer As Long, SourceArray() As Any, _
Optional ByVal Length As Long = 4&)

Private Declare Sub CopyMemory _
Lib "kernel32.dll" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, _
Optional ByVal Length As Long = 4&)

Private Function VectorElementCount(Source() As Byte) As Long
Dim pSafeArray As Long
Dim iCount As Long
Call CopyMemoryFromArray(pSafeArray, Source)
If 0& = pSafeArray Then Exit Function
Call CopyMemory(iCount, ByVal pSafeArray + 16&)
VectorElementCount = iCount
End Function

Private Sub Form_Load()
Dim abBuffer() As Byte
abBuffer = "あえいおう"
Debug.Print VectorElementCount(abBuffer)
End Sub

というのでも希望しているのでしょうか?
--
K.J.K.
ak...@koalanet.ne.jp

tmk

unread,
Sep 9, 2006, 3:18:11 PM9/9/06
to

K.J.K様ありがとうございます。

Private Type STRARRAY
Item() As String '各要素には 0~大体20文字程度の半角全角混在の文字列が格納されます
End Type

Private m_Data() As STRARRAY

このような構造のデータを扱っておりまして、m_Data() の要素数が50000ほどありこの要素数は実行時に増減します。
Item() As String の要素数は 0 ~15程度で、これも実行時に増減します

このデータの中からさまざまな条件(実行時に任意に指定します)に適合する要素を使用して、、、
という流れなのですが。ループで回して条件に適合するか判定するために、
m_Data(n).Item() の要素数を取得する必要があります。大雑把に言うとこういう感じです。

教えていただいた方法でやるには

Private Type BYTEARRAY
Data() As Byte
End Type

Private Type STRARRAY
Item() As BYTEARRAY
End Type

Private m_Data() As STRARRAY

こういう風にすればいいということになると思うのですがなんだかなぁ・・・・

Private Type STRARRAY
Item() As String
Count As Long
End Type

Private m_Data() As STRARRAY

ちなみに今は、こういう感じで Count に Items() の要素数を ReDim した時に随時格納する方法で一応対応しています。。。


K.J.K.

unread,
Sep 10, 2006, 3:02:51 AM9/10/06
to
K.J.K.です。

# 改行は適切に。

"tmk" wrote in message
<eS2FzSE1...@TK2MSFTNGP03.phx.gbl>
> このような構造のデータを扱っておりまして、m_Data() の要素数が50000ほどあり
(以下略)

とりあえず、私が提示したコードは使ったのでしょうか?
それとも関係ない、というのでしょうか?

> Private Type STRARRAY
> Item() As String
> Count As Long
> End Type

関数で求めるよりも変数に入れておくほうが速いでしょうね。

しかし、現実的な処理ならば、既存のデータベースエンジンを使って
一時的なデータベースを作り、それを利用したほうがいいのでは。

とりあえず、仕様を見直すか、自分の技量・知識を見直すか、を
すべきでしょう。
--
K.J.K.
ak...@koalanet.ne.jp

tmk

unread,
Sep 10, 2006, 4:57:31 PM9/10/06
to

> とりあえず、私が提示したコードは使ったのでしょうか?
> それとも関係ない、というのでしょうか?

使って試させていただきました。
小規模なサンプルを作って比較してみたところ、高速に機能しました。
もう少し厳密にいいますと、空の配列を渡したとき格段に実行速度に差が出ました。
ただ、各所でJoin関数を使用しておりまして・・・・
あと、データを比較する方法も改良する必要が発生するため
そっちのほうの変更に時間がかかるので、やめておきました。

> しかし、現実的な処理ならば、既存のデータベースエンジンを使って
> 一時的なデータベースを作り、それを利用したほうがいいのでは。
>
> とりあえず、仕様を見直すか、自分の技量・知識を見直すか、を
> すべきでしょう。

貴重なご意見ありがとうございます
データベースエンジンを利用する方向で一度テストしてみます。

K.J.K.

unread,
Sep 10, 2006, 8:14:11 PM9/10/06
to
K.J.K.です。

"tmk" wrote in message
<#2Dt9uR1...@TK2MSFTNGP06.phx.gbl>


> > とりあえず、私が提示したコードは使ったのでしょうか?
> > それとも関係ない、というのでしょうか?
> 使って試させていただきました。
> 小規模なサンプルを作って比較してみたところ、高速に機能しました。
> もう少し厳密にいいますと、空の配列を渡したとき格段に実行速度に差が出ました。

なぜしつこく問い質したかというと、文字列の操作と比較すれば、
配列の長さの測定にはそれほど時間を取っていない、ということが
予想されるからです。

つまり、

"tmk" wrote in message
<#1PjAV20...@TK2MSFTNGP06.phx.gbl>
> VB6で、一次元配列の要素数を高速に取得する方法を現在模索しております。
>

> 下記ソースのFunction ※1 なんですが、仕様は引数で渡された配列の要素数を
> 返すようにしたいわけなのですが、このFunctionはアプリ内の各部から非常に
> 多く実行されるため、
>
> On Error ステートメントをはずしたいと考えているのですが、良い方法はある
> でしょうか・・

と「原因をそこに求めるのには無理があるだろう」というのが主旨です。

しかし、その場合でも、

"tmk" wrote in message
<#2Dt9uR1...@TK2MSFTNGP06.phx.gbl>


> ただ、各所でJoin関数を使用しておりまして・・・・
> あと、データを比較する方法も改良する必要が発生するため
> そっちのほうの変更に時間がかかるので、やめておきました。

が、私の提示したコードを使わない理由にはならないのでは、と思います。
「効果が認められない」のならば理解できますが、現時点では論旨に一貫性を
欠いている、もしくは、情報提示が不十分である、のどちらかのように
見受けられます。

> データベースエンジンを利用する方向で一度テストしてみます。

もちろん、仕様の大幅な変更を必要とするでしょう。
--
K.J.K.
ak...@koalanet.ne.jp

0 new messages