0

構造体を定義する *.H があります。このような:

#define nfloats 9999
#define nword   655

typedef struct {

int a
short b
unsigned short d
float e
char t[nword]
short un[14]
float  dat[nfloats];

} datafile

void c では、データファイルのすべてのパラメータに値が割り当てられます。TYPE を使用して再定義せずに、割り当てられた値をメインの Fortran プログラムに渡したい。*.H と iso_c_binding を呼び出すだけです。つまり、すでに*. H. 誰かが何か提案していますか?

どうもありがとう!

4

1 に答える 1

0

最も簡単な方法は、C 定義を読み取って Fortran に変換するスクリプトを好みの言語で作成することです。構文を修正すれば、非常に簡単です。

1) #define xxx yyy が整数になる、パラメータ:: xxx = yyy

2) Fortran には unsigned がないため、unsigned short と short はどちらも整数 (kind=1) です。

3) 文字配列の使用方法によって異なります。それらが個別の文字を返し、一括で割り当てられていない場合は、文字 t(nword) として宣言できます。それらが文字列を保持すると予想される場合は、 character(len=nword) t と宣言する必要があります。

4) typedef 構造体 { ... } データファイル

になる

タイプ データファイル シーケンス ... 終了タイプ

5) 以上のことをすべて行った後、C と Fortran の両方のコードのバイト境界が同じであることを確認する必要があります。655 の char 配列はバイト境界にないため、アライメントの問題が発生する可能性があります。

2 番目の方法は、マクロをいじって、マクロに生成を任せることです。C 用に 1 セットのマクロを定義し、Fortran 用に別のセットを定義する必要があります。だからあなたは次のようなものを得るでしょう

STRUCT_BEG(datafile)
   INTEGER(a)
   SHORT(b)
   ...
   CHARA(t,nword)
   FLOATA(dat,nfloats)
STRUCTEND(datafile)

Cの定義は次のようになります

#define STRUCT_BEG(ignore) typedef struct {
#define STRUCT_END(name)   } name;
#define INTEGER(a) int a;
#define CHARA(a,length) char a[length];

Fortranの定義は次のようになります

#define STRUCT_BEG(name) \
    type name \
        sequence
#define STRUCT_END(ignore) end type
#define INTEGER(a) integer::a
#define CHARA(a,length) character(len=length):: a

-e を指定してコンパイルすると、C コンパイラを使用して両方のヘッダーを生成できます。

于 2013-04-13T19:45:52.063 に答える