我有一个定义结构的* .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.有人建议吗?
非常感谢!
答案 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编译器生成两个标头。