如何将 c 标头中定义的结构用于 fortran?
Posted
技术标签:
【中文标题】如何将 c 标头中定义的结构用于 fortran?【英文标题】:How to using a struct defined in the c header for fortran? 【发布时间】:2013-04-10 23:08:38 【问题描述】:我有一个定义结构的 *.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 程序,而不必使用 TYPE 重新定义。只需调用 *.H 和 iso_c_binding。换句话说,我希望在 fortran 主程序中使用已经在 *. H. 有人提出建议?
非常感谢!
【问题讨论】:
嗯,你可以做到,但它需要将c类型翻译成fortran,所以你需要一个翻译器或解释器。 Fortran ISO C 绑定不理解 Fortran 源代码中的 C。它为您提供了在 Fortran 中指定使用与 C 兼容的变量、调用等的方法。您必须编写该 Fortran 代码;它不是自动的。 【参考方案1】:最简单的方法是用您喜欢的语言编写一个脚本,该脚本读取 C 定义并将其转换为 Fortran。如果你修正了你的语法,那就很容易了。
1) #define xxx yyy变成整数,参数::xxx = yyy
2) Fortran 中没有无符号,因此无符号短裤和短裤都是整数(种类=1)。
3) 这取决于您如何使用字符数组。如果它们返回单个字符,而不是分配 en 块,则可以将它们声明为字符 t(nword)。如果期望它们保存字符串,则应将它们声明为 character(len=nword) t。
4) typedef 结构 ... 数据文件
变成
类型数据文件 顺序 ... 结束类型
5) 完成所有这些之后,您需要确保 C 和 Fortran 代码具有相同的字节对齐方式。您的 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 编译器生成两个头文件。
【讨论】:
以上是关于如何将 c 标头中定义的结构用于 fortran?的主要内容,如果未能解决你的问题,请参考以下文章