tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル構造体のサイズ制限
記事No11401
投稿日: 2008/02/12(Tue) 18:11
投稿者ダリア
いつもお世話になります。ダリアです。
ご質問よろしくお願いいたします。

ただ今、共有メモリをメモリマップトファイルでアクセスしようとしています。
構造体を設定しているのですが、各種設定用412バイト、ログデータ用に以下のように
    Log(100) As String * 50
で5000バイトを設定しています。
トータルで5452バイトになります。
(どこから40バイトが加算されているのかは不明ですが、プログラムを起動するとそうなっていました)
これですと、プログラムは起動してくれます。
しかし、本当は
    Log(500) As String * 130
で設定したいのですが、”動的なローカル変数が多すぎます”とエラーがでます。
無理に実行すると、プログラムが落ちてしまいます。
(上記は、完全コンパイル後に実行しないと、という意味です)
64Kバイト以上の設定は出来ないようなことを聞いたような気もいたします。
(ソースがはっきりしないので、うろ覚えなのですが)
現象からは確かに64Kバイトあたりで落ちているように見えます。
ネットでの引き方が悪かったのか、この辺りがはっきりいたしません。

また、このような場合。よい回避方法はありますでしょうか?
動的変数を使って回避できるということをネットで拾ったのですが、その理由が良く分からないのです。
私が使いたい方法ですと、ログデータは最大で500*130で入りますので、上記の方法が有効なのでしょうか?
今は、数回に分けてログを拾ってくるしかないかと思っています。
他に良い方法がありましたら、教えていただけると嬉しいです。

[ツリー表示へ]
タイトルRe: 構造体のサイズ制限
記事No11402
投稿日: 2008/02/12(Tue) 18:55
投稿者花ちゃん
>     Log(100) As String * 50
> で5000バイトを設定しています。

101 × 50 = 5050 と違うのでしょうか?
(Option base 1 を宣言されているのでしょうか)

VB6.0 の場合、表示等で扱う場合は、バイトではなく 50文字になります。
但し、上記の設定でファイル等に保存する場合は、50バイトになります。

Private Type MyType
   X As Integer
   Y As Long
   Z As String * 50
End Type
Private Sub Form_Load()
   Dim Test As MyType
   Debug.Print Len(Test)      '56
   Debug.Print LenB(Test)     '108  Long も Integer 4 Byte
End Sub



> 64Kバイト以上の設定は出来ないようなことを聞いたような気もいたします。

下記でしょうか?(BT6 07/12/06-09:04 No.10832)
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=10813

[ツリー表示へ]
タイトルRe^2: 構造体のサイズ制限
記事No11403
投稿日: 2008/02/12(Tue) 19:24
投稿者ダリア
花ちゃん様
早速のお返事ありがとうございます。

5000バイトは私の勘違いです。
Log(0)を忘れていました。
いつも1から数えてしまうもので、すみません。

Log(100) As String * 50
さて、上記Log配列には50文字を100列のデータを入れるイメージのつもりでした。
(本当は、130文字500列で入れたいのですが)
そのため、表示等で扱う場合は50文字になるというご指摘、大変参考になりました。
(考え方は間違っていないようでホッとしています)
ところで、ファイル等に保存する場合は50バイトになるのはびっくりです。
これは、知りませんでした。

なお、64Kバイト以上の設定については、同じグループの方とお話して教わりました。
その前に自身で数値を色々変えた挙句、ようやく60Kあたりが怪しいと当たりをつけたしだいで。
教えていただいたサイト、大変参考になります。

なお、私が使用したいメモリマップトファイルの構造体では、別の標準モジュール等に分割して変数宣言するという手法は使えないような気がいたします。
あんまり複雑ですと、(構造体で設定する共有メモリはVBとCでアクセスするのですが)Cの担当者さんとの整合が取れるかが今度は心配になってきますし。
やはり、分割してログデータを拾ってきたほうがいいのでしょうか?

[ツリー表示へ]
タイトルRe^3: 構造体のサイズ制限
記事No11410
投稿日: 2008/02/13(Wed) 08:02
投稿者花ちゃん
> なお、64Kバイト以上の設定については、同じグループの方とお話して教わりました。

>Cの担当者さんとの整合が取れるかが今度は心配になってきますし。

> やはり、分割してログデータを拾ってきたほうがいいのでしょうか?

そう言う環境におられるなら、ここで質問されるより、グループの方は相談される方が
いいのでは、何方が回答されても、解決策にはならないように思います。

[ツリー表示へ]
タイトルRe^4: 構造体のサイズ制限
記事No11414
投稿日: 2008/02/13(Wed) 10:01
投稿者ダリア
花ちゃん様

お返事ありがとうございます。

あんまり複雑ですと〜の辺りはすみません。不要な箇所だったと反省しています。
半分くらいは私自身が理解できるのかが不安だったものですから。

状況としましては、グループの方に相談した結果、分割してログデータを取るしか思いつかないという状況です。何か他に良い方法がないだろうか、と困っているといった次第でして。
何分にも、メモリマップトファイルを用いるのはグループ内でも初めてなもので、初の試みであちこち行き詰っているといった感じです。
申し訳ありませんが、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^5: 構造体のサイズ制限
記事No11415
投稿日: 2008/02/13(Wed) 10:32
投稿者魔界の仮面弁士
そもそも構造体/ユーザー定義型は、巨大なデータの管理には向きません。

一括取得が必要なら、ユーザー定義型でやりとりするのではなく、
Byte 配列としてやりとりすれば良いんじゃ無いかな?

> 分割してログデータを取る
それもまた一案。

[ツリー表示へ]
タイトルありがとうございました
記事No11443
投稿日: 2008/02/18(Mon) 16:34
投稿者ダリア
> そもそも構造体/ユーザー定義型は、巨大なデータの管理には向きません。
>
> 一括取得が必要なら、ユーザー定義型でやりとりするのではなく、
> Byte 配列としてやりとりすれば良いんじゃ無いかな?
>
> > 分割してログデータを取る
> それもまた一案。


魔界の仮面弁士様、お返事ありがとうございます。
お礼が遅くなりまして、申し訳ありません。
実は勘違いしていた箇所がありまして、思ったように構造体のサイズが取れなかったのですが。(MSDNライブラリの”データの制限”を参考にしていたのですが、その回避方法を間違って解釈していたため、思うようにサイズが取れていませんでした。)
適切な構造体サイズが得られたので、これにて2,3回に分けてデータを取ってこようと思います。
花ちゃん様、魔界の仮面弁士様、お返事どうもありがとうございました。

[ツリー表示へ]