投稿日 | : 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上限)に引っかかるでしょうし。
メモリ制限が色々あるとは驚きです。
判りづらい質問にも関わらず丁寧に教えていただきありがとうございます。