VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 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上限)に引っかかるでしょうし。

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


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -