プロが教えるわが家の防犯対策術!

グローバルで宣言した構造体の配列に
2万件ほどの情報をかくのうしました。
あるタイミングでその情報をクリアしたいのですが
ものすごく時間がかかります。
 Redim AAA(0)
でクリアしても時間かかるし(300秒)
 Erase AAA
でもかなりの時間がかかります。(350秒)
これ以外に配列の初期化方法をご存知でしたら
教えてくださいよろしくお願いします。

 

A 回答 (4件)

ある程度の法則を持ってもよいのなら、APIがあります。

ZeroMemoryです。
VBのString型は文字列の長さによってバイト数が変化するため、あらかじめバイト数を指定しておかないといけません。
もしそれを指定しないと、ひとつひとつの配列のサイズがバラバラのため、きちんと開放されなかったり、必要なメモリ領域まで開放するおそれがあります。もしVariantなどが含んでいるならばこれは使わないほうが良いかと思います。

サンプルでは
Byte = 1バイト
Integer = 2バイト
Long = 4バイト
String = 文字長によって可変。サンプルでは100バイト
なので、配列は107×256バイトの領域を使用しているのがわかります。


---------------これよりサンプル---------------

'テスト用の適当な構造体
Private Type typetype
  bytTest As Byte
  intTest As Integer
  lngTest As String
  strTest As String * 100
End Type

'初期化するAPI 第一パラ:構造体の先頭ポインタ/第二パラ:サイズ
Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (ByVal Destination As Long, ByVal Length As Long)

'構造体の配列数
Private Const DEF_ARY_SIZE As Long = 256


Private Sub Command1_Click()
  Dim testTest(DEF_ARY_SIZE - 1) As typetype
  Dim i  As Long
  
  '適当な値を設定
  For i = LBound(testTest) To UBound(testTest)
    With testTest(i)
      .bytTest = i
      .intTest = i * 10
      .lngTest = i * 100
      .strTest = Chr(i)
    End With
  Next i

  '構造体の初期化
  Call ZeroMemory(ByVal VarPtr(testTest(0)), Len(testTest(0)) * DEF_ARY_SIZE)
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます(^_^)

丁寧なサンプル付で。
参考にさせていただきますm(__)m

お礼日時:2002/07/21 11:46

構造体配列の初期化はErase, Redim以外の方法はないと思います。



メモリの余裕はあるのでしょうか?
タスクマネージャ等で観察して下さい。
足りなければメモリを増設するべきでしょう。

可変長文字列を使っているなら固定長文字列にした方がいい気がします。

マシンスペックと構造体の定義が分かれば、他に案が出るかも
    • good
    • 0
この回答へのお礼

ありがとうございます。

やっぱり初期化はErase, Redim以外の方法はないですか・・・。

お礼日時:2002/07/21 11:45

あ~、そのくらいのデータ数の配列だと「致し方なし」というところですねぇ。

。。

あとはクラスモジュールつかって、コレクション化するとかかな。
それならクリア時にはクラスのインスタンスを破棄するだけだから、
それほど時間かからないかも。
    • good
    • 0
この回答へのお礼

ありがとうございます。

知識が足りずにどうしたらいいか
わかりません(><)

お礼日時:2002/07/21 11:44

一度確保したメモリを解放して,メモリアロケーションで再確保してはいかがでしょうか.

    • good
    • 1
この回答へのお礼

ありがとうございます。

メモリの解放ですが
Eraseを使用する以外の方法で時間がかからない方法が
有れば教えてほしいのですが。
Eraseだとものすごく時間がかかります。
解放自体に時間がかかってしまい、困っています(T_T)

よろしくお願いします。

お礼日時:2002/07/19 10:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!