このインテルの専門家が説明と洗練されたソリューションを提供します。私はそれをよりよく説明することができませんでした。完全な引用は次のとおりです。
「ある日、地元の食料品店の通路をさまよっているときに、女性が私をテーブルに招き、「輸入チョコレートを試してみませんか」と尋ねました。テーブルには、リンツ、トブラローネ、 ...ギラデリ?私は女性に、カリフォルニアがユニオンから脱退したかどうかを尋ねました。ギラデリは、イタリアの名前にもかかわらず、サンフランシスコから来たものです。ニューハンプシャーの見晴らしの良い場所から、カリフォルニアは別の国かもしれないと思います。ニューヨーカーの有名なソールスタインバーグ1976年の表紙、「9番街からの世界の眺め」に描かれているように。
(私のブログには十分な任意のリンクがないという警告がありました-これはしばらくの間それらを保持するはずです。)
同様に、Fortran(私がいつそこにたどり着くのか疑問に思っていたに違いありません)では、何かが非常に近くにあるのに、遠くに見えることがあります。少し前に、Win32 Process Status APIの宣言を提供するために、IntelVisualFortran用の新しいモジュールを作成していました。これには、型と定数の宣言、およびAPIルーチンのインターフェイスブロックが含まれ、その一部は新しい型の引数を取ります。自然な傾向は、次のようなものを書くことです。
MODULE psapi
TYPE sometype
some component
END TYPE sometype
INTERFACE
FUNCTION newroutine (arg)
INTEGER :: newroutine
TYPE (sometype) :: arg
END FUNCTION newroutine
END INTERFACE
END MODULE psapi
コンパイルしてコンパイルすると、argの宣言でsometype型が未定義であるというエラーが発生します。「なに?宣言されていないわけではない。同じモジュールの真上で見ることができる!」ええ、はい、いいえ。はい、モジュールで宣言されており、モジュール内のどこでも使用できます。ただし、インターフェイスブロックを除きます。
問題は、インターフェースブロックが「外部ルーチンへのウィンドウ」であるということです。ルーチンがFortranで書かれていると仮定すると、実際の外部ルーチンに表示される宣言を本質的に複製します。そのため、それらは、囲んでいるスコーピングユニット(この場合はモジュール)からのシンボルを「ホストアソシエート」しません。
Fortran90およびFortran95では、これに対する一般的な解決策は、使用するすべての型と定数を含む「psapi_types」などの個別のモジュールを作成することでした。次に、各関数内にUSEステートメントを追加します。あなたはFortranで書かれた架空の外部ルーチンでやらなければならないでしょう。(Fortranで書かれている場合、医者は濡れたパンチカードで手首を叩き、ルーチンをモジュール手順にするように指示します。そうすれば、このナンセンスについて心配する必要はありません。)したがって、何かになってしまいます。このような:
MODULE psapi
USE psapi_types ! This is for the benefit of users of module psapi
INTERFACE
FUNCTION newroutine (arg)
USE psapi_types
INTEGER :: newroutine
TYPE (sometype) :: arg
...
Intel Visual Fortranを使用している人は、実際には、この目的のために、他のWin32APIのすべての型と定数を含む巨大なモジュールIFWINTYがあることを知っています。それは厄介でエレガントではありませんが、それはあなたがしなければならないことです。今まで...
Fortran 2003は、この残念な状況にいくらかの優雅さを取り戻そうとしますが、古いソースとの互換性を維持するために、インターフェイスブロックがホストアソシエーションに参加していることを宣言することはできません。代わりに、新しいステートメントIMPORTが作成されました。IMPORTは、インターフェースブロックにのみ表示でき、ホストスコープに表示される名前をインポートするようコンパイラーに指示します。
IMPORTは、USEステートメントの後、ただしインターフェース本体のIMPLICITステートメント(FUNCTIONまたはSUBROUTINE宣言)の前に配置されます。IMPORTには、USEと同様に、オプションのimport-name-listを含めることができます。1つがないと、ホストでアクセス可能なすべてのエンティティがインターフェイス本体内に表示されます。リストを使用すると、指定されたエンティティのみが表示されます。
IMPORTを使用すると、PSAPIモジュールは、次の変更を加えた最初の例のようになります。
...
FUNCTION newroutine (arg)
IMPORT
INTEGER :: newroutine
TYPE(sometype) :: arg
...
必要に応じて、次を使用できます。
IMPORT :: sometype
その1つの名前だけをインポートしたかったと言います。素晴らしく、きちんとしていて、すべてが1つのモジュールにあります!
「しかし、なぜあなたは私にこれを言っているのですか?」、「それはFortran 2003の機能であり、IntelFortranはまだFortran2003のすべてを実行しているわけではありません」とあなたは尋ねるかもしれません。確かにそうですが、F2003の機能をコンパイラーに追加し続けており、IMPORTは8月にそれを実現しました。したがって、合理的に最新の状態を維持している場合は、心ゆくまでインポートして、タイプと定数用の別のモジュールの混乱をなくすことができます。
他にどのようなF2003グッズが利用できるかを知りたい場合は、各アップデートのリリースノートを確認してください。サポートされているF2003機能の完全なリストは、各号にあります。全部集めろ!」