4

属性を持つ変数と属性を持つ変数を含む Fortran モジュールがparameterありますsave。それらparameterはコンパイルされたオブジェクトに含まれていないため、ライブラリをアセンブルしようとすると問題になります。たとえば、ファイルを考えてみましょうtestModule.f90:

module testMOD
  integer, save :: thisIsSaved = 1
  integer, parameter :: thisIsParametered = 2
end module testMOD

これを次のようにコンパイルします: ifort -c testModule.f90. 中身を確認すると:

>$ nm testModule.o
0000000000000000 T testmod._
0000000000000000 D testmod_mp_thisissaved_

thisIsSaved変数のみが存在します。ではなく変更できるthisIsParameteredことはわかっていますが、理想的には、リンクしているユーザーがこの値を変更できないようにしたいと考えています。これを行う方法はありますか?saveparameter

編集: Fortran だけでなく、C コードからもこのライブラリにアクセスできるようにしたいと思います。

4

2 に答える 2

4

他の人が指摘しているように、パラメーターは名前付き定数であり、実装はオブジェクトコード(特にスカラー)でその定数のストレージを確保できない場合があります。

ライブラリは、Cクライアント用のヘッダーファイルを提供する必要があります。そのヘッダーファイルのFortranパラメーターの値は、#defineまたはconstのいずれかで定義できます。

これには、パラメーターの値を2か所で保守する必要がありますが、ライブラリーのインターフェースの他の側面では、すでにその保守の負担があります。

于 2013-02-05T00:31:32.397 に答える
4

これは、実際には .mod ファイルに保存する必要があります。すべてのデータ型と関数プロトタイプがそこに保存されているため、誰かに .lib ファイルを送信するときに含める必要があります。モジュールを別の場所で使用した後、モジュール内でリンクしてみてください。問題なく動作するはずです。

基本的に、.mod ファイルは c の .h ファイルと同じ目的を果たすため、もちろんライブラリに含める必要があります。

[更新:]これをCで使用しようとしている場合、あなたが言ったように、名前付き定数を簡単に維持する手段はありません。別の方法として、エンティティで保護された属性を使用できます。少なくとも Fortran では、モジュール外のものは変数への書き込みが制限されています。C コンパイラとリンカーがこの動作を尊重するかどうかはわかりませんが、おそらくこれが最善の方法だと思います。

module testMOD
 INTEGER, PROTECTED, BIND(C)  :: globalvar = 1
end module testMOD

残念ながら、私は C との相互運用性についてあまり詳しくないので、C が protected 属性を尊重し、変数の変更を許可しないという保証はできません。

于 2013-02-04T20:23:37.020 に答える