はじめまして。いつも拝見させて頂いております。
新規にプロジェクトを作成し、標準モジュールを2つ追加します。
オブジェクト名は追加した時に作成されるオブジェクト名を使用
しています。
下のコードをモジュール内に書き、「完全コンパイル後に実行」とすると
コンパイルエラー:
モジュール間で循環参照が定義されています。
とでます。
<Modile1のコード>
Option Explicit
Public Type A_MEMBER
L1 As Long
End Type
Public Sub EX1(ID As Integer, Abuf1 As A_MEMBER, Bbuf1 As B_MEMBER)
End Sub
<Module2のコード>
Option Explicit
Public Type B_MEMBER
D As Date
End Type
Public Sub EX2(Abuf2 As A_MEMBER, Bbuf2 As B_MEMBER)
End Sub
エラー自体は一つのモジュール内にユーザー定義型をまとめると解決するのですが、何故このようなエラーが発生するのか理解できません。
何が原因で循環参照が発生しているのか、ご教授お願いできないでしょうか?
Moudle1 上のプロシージャ引数の型定義が Module2 に依存しており、
Moudle2 上のプロシージャ引数の型定義も Module1 に依存しているため、
Module1, Module2 が相互に参照しあう形になっている、ということかと。
相互参照していると、どちらのモジュールを先にコンパイルすれば
よいのか判断できないでしょうし。
お早い回答ありがとうございます。
魔界の仮面弁士さんはじめまして。
相互参照していると、どちらのモジュールを先にコンパイルすれば
よいのか判断できないでしょうし。とありましたが、
標準モジュールを1つ新しく追加してその中に
<Modile1のコード>
Option Explicit
Public Type A_MEMBER
L1 As Long
End Type
<Module2のコード>
Option Explicit
Public Type B_MEMBER
D As Date
End Type
<Module3のコード>
Public Sub EX3(Abuf3 As A_MEMBER, Bbuf3 As B_MEMBER)
End Sub
と書きなおすと正常にコンパイルできます。
またModule3のオブジェクト名をModule0としても正常でした
やはり同時に相互に参照しあう値渡しは危険なのですね。
モジュール内の変数を用途ごとに分けれたらよかったのですが・・・
> と書きなおすと正常にコンパイルできます。
その場合、Module3 は Module1 と Module2 に依存していますが、
Module1 および Module2 は、他のモジュールに依存していない状態です。
定義がモジュール間で循環していないため、コンパイル可能となります。
> またModule3のオブジェクト名をModule0としても正常でした
今回の場合、名称は関係ありませんよね。
> やはり同時に相互に参照しあう値渡しは危険なのですね。
値渡し…… ByVal ですか?
今回の問題とは無関係なキーワードに思えますが…。
返信ありがとうございます。
魔界の仮面弁士さん指摘ありがとうございます。
Byvalで値渡し Byvalなしで両渡しですね。
いつもそれで値渡しと言っているので勘違いしていました。
[解決]チェックが無い所を見ると、まだ問題は
解決できていないということなのでしょうか?
> Byvalなしで両渡しですね。
「両渡し」とは何でしょうか?
ヘルプには記載されていない用語のようですが…。
なお、VB6 における「ByVal 無し」は、「参照渡し(ByRef)」を意味します。
すみません。
また間違ってました。
参照渡しのことです。
今後気をつけます。
本当にありがとうございました。
ツイート | ![]() |