如何使用fortran的c头中定义的结构?

如何使用fortran的c头中定义的结构?,c,fortran,header-files,fortran-iso-c-binding,language-interoperability,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中,数据文件的所有参数都被赋值。我希望将指定的值传递给主fortran程序,而不必使用类型重新定义。只需调用*.H和iso_c

我有一个*.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中,数据文件的所有参数都被赋值。我希望将指定的值传递给主fortran程序,而不必使用类型重新定义。只需调用*.H和iso_c_绑定。换句话说,我希望在fortran主程序中使用*中已经定义的“数据文件”。有人提出建议吗


非常感谢

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

1) #定义xxx yyy为整数,参数::xxx=yyy

2) Fortran中没有无符号,因此无符号的短字符和短字符都是整数(种类=1)

3) 这取决于您如何使用字符数组。如果它们返回单个字符,而不是按块分配,则可以将它们声明为字符t(nword)。如果希望它们保存字符串,则应将它们声明为character(len=nword)t

4) 类型定义结构{ ... }数据文件

变成

类型数据文件 序列 ... 端型

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

第二种方法是使用宏并让宏为您生成。您需要为C定义一组宏,为Fortran定义另一组宏。所以你会得到这样的结果

STRUCT_BEG(datafile)
   INTEGER(a)
   SHORT(b)
   ...
   CHARA(t,nword)
   FLOATA(dat,nfloats)
STRUCTEND(datafile)
#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
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的定义类似于

STRUCT_BEG(datafile)
   INTEGER(a)
   SHORT(b)
   ...
   CHARA(t,nword)
   FLOATA(dat,nfloats)
STRUCTEND(datafile)
#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编译器可以用来生成这两个头。

当然可以,但它需要将C类型转换为fortran,因此需要一个转换器或解释器。fortran ISO C绑定不理解fortran源代码中的C。它提供了在Fortran中指定使用与C兼容的变量、调用等的方法。您必须编写Fortran代码;这不是自动的。