如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 调用带有可选参数的 Fortran 子例程

从 C++ 调用带有可选参数的 Fortran 子例程

HDF5 用于使用 fortran 编写的数据文件

C-Fortran 字符串互操作性

C-Fortran 字符串互操作性

构造函数的返回类型定义 - 如何修复此标头