「コンパイルエラー:モジュール間で循環参照が定義されています」というエラーが発生する要因とは?

解決


L'Kbreth  2007-09-13 19:47:05  No: 99424

はじめまして。いつも拝見させて頂いております。

新規にプロジェクトを作成し、標準モジュールを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

エラー自体は一つのモジュール内にユーザー定義型をまとめると解決するのですが、何故このようなエラーが発生するのか理解できません。

何が原因で循環参照が発生しているのか、ご教授お願いできないでしょうか?


魔界の仮面弁士  2007-09-13 20:39:09  No: 99425

Moudle1 上のプロシージャ引数の型定義が Module2 に依存しており、
Moudle2 上のプロシージャ引数の型定義も Module1 に依存しているため、
Module1, Module2 が相互に参照しあう形になっている、ということかと。

相互参照していると、どちらのモジュールを先にコンパイルすれば
よいのか判断できないでしょうし。


L'Kbreth  2007-09-13 21:10:56  No: 99426

お早い回答ありがとうございます。

魔界の仮面弁士さんはじめまして。
相互参照していると、どちらのモジュールを先にコンパイルすれば
よいのか判断できないでしょうし。とありましたが、

標準モジュールを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としても正常でした

やはり同時に相互に参照しあう値渡しは危険なのですね。
モジュール内の変数を用途ごとに分けれたらよかったのですが・・・


魔界の仮面弁士  2007-09-13 22:04:12  No: 99427

> と書きなおすと正常にコンパイルできます。
その場合、Module3 は Module1 と Module2 に依存していますが、
Module1 および Module2 は、他のモジュールに依存していない状態です。

定義がモジュール間で循環していないため、コンパイル可能となります。

> またModule3のオブジェクト名をModule0としても正常でした
今回の場合、名称は関係ありませんよね。

> やはり同時に相互に参照しあう値渡しは危険なのですね。
値渡し…… ByVal ですか?
今回の問題とは無関係なキーワードに思えますが…。


L'Kbreth  2007-09-13 22:17:31  No: 99428

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

魔界の仮面弁士さん指摘ありがとうございます。
Byvalで値渡し Byvalなしで両渡しですね。

いつもそれで値渡しと言っているので勘違いしていました。


魔界の仮面弁士  2007-09-13 22:50:00  No: 99429

[解決]チェックが無い所を見ると、まだ問題は
解決できていないということなのでしょうか?

> Byvalなしで両渡しですね。
「両渡し」とは何でしょうか?
ヘルプには記載されていない用語のようですが…。

なお、VB6 における「ByVal 無し」は、「参照渡し(ByRef)」を意味します。


L'Kbreth  2007-09-13 22:56:45  No: 99430

すみません。

また間違ってました。

参照渡しのことです。
今後気をつけます。

本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加