下記ソースの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
"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
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 した時に随時格納する方法で一応対応しています。。。
# 改行は適切に。
"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
使って試させていただきました。
小規模なサンプルを作って比較してみたところ、高速に機能しました。
もう少し厳密にいいますと、空の配列を渡したとき格段に実行速度に差が出ました。
ただ、各所でJoin関数を使用しておりまして・・・・
あと、データを比較する方法も改良する必要が発生するため
そっちのほうの変更に時間がかかるので、やめておきました。
> しかし、現実的な処理ならば、既存のデータベースエンジンを使って
> 一時的なデータベースを作り、それを利用したほうがいいのでは。
>
> とりあえず、仕様を見直すか、自分の技量・知識を見直すか、を
> すべきでしょう。
貴重なご意見ありがとうございます
データベースエンジンを利用する方向で一度テストしてみます。
"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