如何使用cran标头中为fortran定义的结构?

时间:2013-04-10 23:08:38

标签: c fortran header-files fortran-iso-c-binding language-interoperability

我有一个定义结构的* .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中,数据文件的所有参数都被赋值。我想将指定的值传递给main fortran程序,而无需使用TYPE重新定义。只需调用* .H和iso_c_binding。换句话说,我希望在已经在*中定义的fortran主程序中使用“datafile”。 H.有人建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

最简单的方法是用您喜欢的语言编写一个脚本,该脚本读取C定义并将其转换为Fortran。如果你修复了语法,那就很容易了。

1)#define xxx yyy变为整数,参数:: xxx = yyy

2)Fortran中没有unsigned,所以unsigned short和short都是整数(kind = 1)。

3)这取决于你如何使用字符数组。如果他们返回单个字符,而不是en block,则可以将它们声明为字符t(nword)。如果期望它们保持字符串,那么它们应该被声明为字符(len = nword)t。

4)typedef struct { ... } datafile

变为

输入数据文件    序列    ... 结束类型

5)完成所有这些后,您需要确保C和Fortran代码具有相同的字节对齐。您的char数组655不在字节边界上,因此您可能会遇到对齐问题。

第二种方法是使用宏并让宏为你做代。您需要为C定义一组宏,为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编译器生成两个标头。