• ベストアンサー

VBで構造体を使うさ際の64k制限の回避方法教えてください。

VBで構造体を使う際に、起動すると64kを超える事は出来ませんとエラーが出ます。 構造体上は64k越えてもいないのに、このようなエラーが発生します。 また、可変長配列などにすると起動は出来るのですが、 結局、データが増えていけば、エラーになると思われます。 何か良い方法はありませんか? 教えてくださいm(__)m P.S. レジストリはあまりいじりたくないのですが・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.5

WWW()=TTTT(2)  '1回目 このような使い方できません。 Redim Preserve WWW(500000) '500000回目 でも問題ありません。 連続した64キロバイト以上のメモリを確保できない といっているのです。 Redim Preserve WWW(500000)のように 断片化した64キロバイト以上のメモリは確保できる。

tomsoya
質問者

お礼

なるほど!! よくわかりました。 ありがとうございます。m(__)m

その他の回答 (4)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

コンパイルエラー 「固定長文字列型や静的変数のデータの大きさは64KBを超えることはできません。」 の事でしょうか? string * 70000とかは無理です。 あるいは構造体のサイズが64キロバイトを超えることも不可です。 Type AAA a(20000) As Byte b(30000) As Byte c(40000) As Byte End Type 20000 + 30000 + 40000 + 構造体の情報(約30) > 65536(=64キロバイト) なので上記のエラーが発生します。

tomsoya
質問者

補足

言われているとおりですが・・ たとえば、 Type AAA a(10000) As Byte End Type public TTT(2) as AAA public WWW() as AAA の構造体で、TTT(2)には毎回新しいデータが入ってくるとすれば WWW()=TTTT(2)  '1回目 WWW()=TTTT(2)  '2回目 ・ ・ WWW()=TTTT(2)  '4回目 ではエラーが出るが Redim WWW(2)  '1回目 WWW(1)=TTTT(1) WWW(2)=TTTT(2) Redim Preserve WWW(4)  '2回目 WWW(3)=TTTT(1) WWW(4)=TTTT(2) ・ ・ Redim Preserve WWW(8)  '4回目 WWW(7)=TTTT(1) WWW(8)=TTTT(2) では定義している(Redimしている)バイト数が64Kを超えていない為問題ないという事でいいんでしょうか?

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

>エラーにはならないのでしょうか? なりません。動的メモリ確保はメモリが断片化してもそれをOSが制御しています。

tomsoya
質問者

補足

ありがとうございます。m(__)m 申し訳ないですが、教えていただきたいのですが 64Kのエラーはどういった場合に発生するのでしょうか? もう少し詳しく教えていただけないでしょか? よろしくお願いします。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

動的にとれば良いだけです。 Private Sub Form_Load() Dim jew() As JEW99A ReDim jew(100) '足りなくなったら増やす。 ReDim Preserve jew(1000) End Sub

tomsoya
質問者

補足

なるほど・・ でも、ReDimした新しい構造体が64kを超えてしまっても 問題ないのでしょうか? エラーにはならないのでしょうか? 例えば、 ReDim jew(100)  '//20Kバイト ・ ・ ・ ReDim Preserve jew(200)  '//40Kバイト ・ ・ ・ ReDim Preserve jew(400)  '//80Kバイト までいった場合は、この時点でエラーになりそうですが 大丈夫なのですか?

  • run_away
  • ベストアンサー率42% (8/19)
回答No.1

「可変長文字列 1 つにつき 4 バイトだけが使われ、実際の文字列の内容は別な場所に保存される」 ということなので、可変長文字列をうまく使用してはいかがでしょうか?

tomsoya
質問者

補足

具体的にはどういった形で制御すればいいんでしょうか? ちなみに使っている構造体は以下のとおりです。 ------------------------------------------- Type JEW99A WCRNRITMID(7) As Byte WCUSERID(5) As Byte WCGYOMGP(1) As Byte WCHAKOBMCD(18) As Byte WCFILLER(18) As Byte WCERROKKNA(27) As Byte WCABNDCD(8) As Byte WCABNDMS(59) As Byte WCGYOMNA(29) As Byte WCGYOMMS(61) As Byte WCFILLER02(6) As Byte End Type Type WC_HEDB21 WCSOUKCD(3) As Byte WCRYKSSKMYKJ(11) As Byte WCSHKADTHD(7) As Byte WCKRMANO(3) As Byte End Type Type WC_HEDB22 WCSHKANOHD(6) As Byte End Type Type WC_HEDB23 WCMEISGYSU02(2) As Byte WCTUGIDEUMKB(0) As Byte WCTGTORHSKSBKB(0) As Byte WCTGOKSKSQCD(12) As Byte WCTGHDASSKCD(3) As Byte WCTGHDASZCCD(1) As Byte WCTGSHKANO(6) As Byte WCTGNTMIJNKB(1) As Byte WCTGHNBN(24) As Byte WCTGHOJOCD(2) As Byte WCTGTKYU(0) As Byte WCTGSSTMKB(0) As Byte WCTGOTOINO(10) As Byte WCTGEDBNOTNO(2) As Byte End Type Type WC_MSAB21 WCKRMANOKB(0) As Byte WCHOMNGP(1) As Byte WCHOMNGPMY(15) As Byte WCTUMIGP(4) As Byte WCTUMIGPMY(19) As Byte WCSHKASGGP(1) As Byte WCSHKASGGPMY(15) As Byte WCHSYAKB(0) As Byte WCHSYAKBMY(19) As Byte WCHISOHH(1) As Byte WCUNGYCD(4) As Byte WCRYKSGYMY(19) As Byte WCSSYU(1) As Byte WCSSYUMY(19) As Byte WCMAXXAISU(9) As Byte WCMAXXAIJR(9) As Byte WCMAXTIMESP(25) As Byte End Type Type WC_MSAB22 WCHISOJN(2) As Byte WCHISOSKMY(25) As Byte WCSHKANO(6) As Byte WCHDASSKCD(3) As Byte WCHDASZCCD(1) As Byte WCHISOKTKB(0) As Byte WCSSTMKBOTNO(0) As Byte WCOTOINO(10) As Byte WCEDBNOTNO(2) As Byte WCHINNNA(9) As Byte WCTOUUCD(0) As Byte WCHNBN(13) As Byte WCTKYU(0) As Byte WCSURY(3) As Byte WCKNPOSU(2) As Byte WCHASUBRSU(2) As Byte WCSSUU(8) As Byte WCJRYO(8) As Byte WCBIKO(3) As Byte WCTORHSKSBKB(0) As Byte WCOKSKSQCD(12) As Byte WCMCKMSKCD(3) As Byte WCMCKMZCCD(1) As Byte WCMEISSBKB(0) As Byte WCSAGYDT(7) As Byte WCNTMIJNKB(1) As Byte WCOKRJSSSMKB(0) As Byte WCUKEISKSKKB(0) As Byte WCSHKADTSK(7) As Byte WCGYOMKB(1) As Byte WCGYOMSB(3) As Byte WCSMKBSHKKNO(0) As Byte WCSOHNKKNO(5) As Byte WCSAGYFYKB(0) As Byte End Type Type WC272C WCJE00 As JEW99A WCHEDB21 As WC_HEDB21 WCHEDB22(4) As WC_HEDB22 WCHEDB23 As WC_HEDB23 WCMSAB21 As WC_MSAB21 WCMSAB22() As WC_MSAB22 End Type Public pbuWC272C(1) As WC272C Type WC272WC WCJE00 As JEW99A WCHEDB21 As WC_HEDB21 WCHEDB22(4) As WC_HEDB22 WCHEDB23 As WC_HEDB23 WCMSAB21 As WC_MSAB21 WCMSAB22(119) As WC_MSAB22 End Type Public pbuWC272WC As WC272WC -------------------------------------------

関連するQ&A