[リストへもどる]
一括表示

投稿時間:2003/12/13(Sat) 19:31
投稿者名:T.T.N
Eメール:
URL :
タイトル:
分割コンパイル
いつもお世話になっております。

Win98上でVB 6.0(SP3)を使ってバイナリファイルを展開し、コメントを付けるツールを
作成しています。
データの種類が多岐に渡り、大きく分けて60種類ぐらいあります。
コメント展開ルーチンを出来るだけ共通化していますが3分の1ぐらい実装したところで
動的変数の合計が32kを超えているという主旨のエラーが出てコンパイルできません。
将来のメンテナンスや自分の技術力を考えるとVC++やJava、C#に変えたくありません。

ヘルプの中には『モジュール分割による”Program-memory overflow”エラーの対処』
という、旧いVB?に付いて書かれているのは見つけました。
VB6.0でも同じようなことは出来ないのでしょうか?

あるいはもっと別な手段で動的変数が32kを超えられるようにならないでしょうか?

投稿時間:2003/12/13(Sat) 20:48
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 分割コンパイル
# 回答ニアラズ…

> 動的変数の合計が32kを超えているという主旨のエラーが出てコンパイルできません。
32kを超えたとの事ですが、現状のコーディング方法の場合、
最終的には、どの程度のサイズになるのでしょうか?

場合によっては、変数の宣言の仕方を見直せば、問題を解決できるかも知れませんよ。

投稿時間:2003/12/14(Sun) 09:09
投稿者名:T.T.N
Eメール:
URL :
タイトル:
Re^2: 分割コンパイル
最終的には今の3倍から4倍になります。

読み込んだデータを解析して構造体に展開したあとコメントを生成す
るようにしています。
データはヘッダ部とデータ部に分かれていますが、ヘッダ部以外は構
成が大きく違うので解析もコメント生成もデータ種別ごとに別プロシ
ージャにしています。
HELPを読む限りではプロシージャ内でDim文とStatic文を混在させれば
ある程度は回避できそうですが極端に小さくするのは無理そうです。

投稿時間:2003/12/15(Mon) 21:46
投稿者名:T.T.N
Eメール:
URL :
タイトル:
Re^3: 分割コンパイル…挫折しました
結局、動的メモリ32kの問題は解決できそうにないです。

解析するデータの種類を使用頻度の高い物に絞っりプロシージャも巨大に
してサブプロシージャを呼ばないようにしてメモリの使用量を押さえます。

根本的解決でないので悔しいですが、これが今の自分の限界です。

#Windowsって2ギガバイトまでアプリケーションにメモリを解放してく
#れるはずなのにたった32kでダメなんて.

投稿時間:2003/12/15(Mon) 22:37
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: 分割コンパイル
>>> 動的変数の合計が32kを超えているという主旨のエラーが出てコンパイルできません。
できれば、エラーメッセージそのままの『正確なエラー内容』を書いていただけないでしょうか。

コンパイル制限の仕様には何種類かありますが、そのうちのどの制限で
警告されているのか、この記述だけでは分かりかねています。

「動的変数」という表現から、動的配列を連想したのですが、この場合、
32KBのサイズ制限などは無いと思いますし。。。
    Dim F() As Byte
    ReDim F(10485759)


> 結局、動的メモリ32kの問題は解決できそうにないです。

変数の宣言方法に、何か無駄があるのではないでしょうか。

エラーの状況が今ひとつ見えていないので、ソースを見ないことには
何とも言えませんが、例えば、グローバル変数が大量に使われていたり、
データサイズが極端に大きなユーザー定義型があったりはしませんか?

エラーの内容がそうした物であるならば、動的配列やコレクションの利用、
あるいはクラス化などによって解決できる可能性があると思います。


> #Windowsって2ギガバイトまでアプリケーションにメモリを解放してく
> #れるはずなのにたった32kでダメなんて.
まぁ、一口にメモリと言っても、管理対象によって、幾つかの種類がありますからね…。

今回の「動的変数」という表現が、USERヒープ領域の事を指しているなら、
OSレベルでの制限(Win95等では、1プロセスあたり32KB上限)に引っかかるでしょうし。

投稿時間:2003/12/16(Tue) 13:02
投稿者名:T.T.N
Eメール:
URL :
タイトル:
Re^5: 分割コンパイル
> >>> 動的変数の合計が32kを超えているという主旨のエラーが出てコンパイルできません。
> できれば、エラーメッセージそのままの『正確なエラー内容』を書いていただけないでしょうか。
>
> コンパイル制限の仕様には何種類かありますが、そのうちのどの制限で
> 警告されているのか、この記述だけでは分かりかねています。

コンパイル時(または実行時に)ダイアログで
「コンパイルエラー:動的なローカル変数が多すぎます」と表示され
ヘルプを開くと
「動的なローカル変数が多すぎます。
ローカル変数、非静的変数は、プロシージャ内に定義されており、
プロシージャが呼び出されるたびに初期化されます。エラーの原因
と対処方法を次に示します。
プロシージャのローカル変数、非静的変数、およびコンパイラで生
成された一時変数に必要なメモリ容量の合計が 32K を超えています。
可能であれば、Static ステートメントで変数を宣言します。Static
変数は、非静的変数とは異なるメモリ リソースに割り当てられるた
め、プロシージャの呼び出しの後でも値が残っています。」
となります。




> 「動的変数」という表現から、動的配列を連想したのですが、この場合、
> 32KBのサイズ制限などは無いと思いますし。。。
>     Dim F() As Byte
>     ReDim F(10485759)

Dim、ReDim合わせて140個、そのうち40個が配列です。
ただエラーになるのがメッセージの種別毎に 振り分けしているプロ
シージャのSelect Case命令の中だったりします。
例えば下のような振り分けをしている部分です。

Function GetComment(ByRef tData as UserTypeData) as string
  ReDim rtc() as string

  Select tData.MessageType
    case MESSAGE_COMMON
      rtc = GetCommentCommon(tData)
    case MESSAGE_ACCIDENT
      rtc = GetCommentAccident(tData)
    case MESSAGE_REPORT
      rtc = GetCommentReport(tData)  ←ここのGetCommentReportでエラーになる
  End Select
  GetComment=rtc
End function


> 変数の宣言方法に、何か無駄があるのではないでしょうか。
>
> エラーの状況が今ひとつ見えていないので、ソースを見ないことには
> 何とも言えませんが、例えば、グローバル変数が大量に使われていたり、
> データサイズが極端に大きなユーザー定義型があったりはしませんか?

ユーザ定義型は大きいですが、グローバルに置いて、プロシージャ
では全てByRef宣言をしています
ソースは諸般の事情からお見せできません。
同じエラーが出るソースを作るのも厳しいですので、勘弁願います。

基本的にはデータの宣言は次のようにしています。

Type UserTypeDataCommon
 ・・・
  それぞれのメッセージ型に合わせて定義
  この宣言が約60個あります
 ・・・
End Type

Type UserTypeData
   MesssageType As Long
   Image(32) As String * 128
   Common As UserTypeDataCommon
   Report As UserTypeDataReport
   Accident As UserTypeDataAccident
   ・・・ メッセージ型を宣言してます。メンバーが約60個です
End Type

Private RecodeData(1 to 999) As UserTypeData
配列の大きさを2000まで増やしてみましたがエラーにはなりませんで
した。

> エラーの内容がそうした物であるならば、動的配列やコレクションの利用、
> あるいはクラス化などによって解決できる可能性があると思います。

コレクション、クラス化は試してませんでした。
試してみます。

> > #Windowsって2ギガバイトまでアプリケーションにメモリを解放してく
> > #れるはずなのにたった32kでダメなんて.
> まぁ、一口にメモリと言っても、管理対象によって、幾つかの種類がありますからね…。
>
> 今回の「動的変数」という表現が、USERヒープ領域の事を指しているなら、
> OSレベルでの制限(Win95等では、1プロセスあたり32KB上限)に引っかかるでしょうし。

メモリ制限が色々あるとは驚きです。
判りづらい質問にも関わらず丁寧に教えていただきありがとうございます。

投稿時間:2003/12/19(Fri) 11:58
投稿者名:T.T.N
Eメール:
URL :
タイトル:
ありがとうございました
変数宣言を見直し、なんとか実用レベルの機能を実装できました。
結局、パフォーマンスの関係からローカルな配列を排除するという
事になりましたが。
VBは2.0以来5年ぶりでとまどうことが多いですが便利になったと実
感しました。使いこなすにはまだまだ勉強が必要ですが。
魔界の仮面弁士様、有用なアドバイスをありがとうございました。