- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一些调用 fortran 的 C 代码,但不清楚 iso_c_binding 模块的使用。
我的 Fortran 和 C 接口(interface)在没有 iso_c_binding 的情况下成功工作,问题是我是否仍应显式绑定(bind)函数和变量。例如,这有效:
program testprog
...
interface
subroutine c_parser(param)
integer, intent(in) :: param
end subroutine
end interface
integer :: a
call c_parser(a)
..
end program
/****************/
void c_parser_ (int* param)
因此,将下划线附加到 C 函数,为其编写接口(interface),并从 Fortran 程序中调用它。我不使用指针或可分配对象,我的所有代码都包含需要从 Fortran 子例程移至 C 的 int、char、float 和 logical。
iso_c_binding 的确切用途是什么?有什么陷阱吗?例如,this在通过绑定(bind)使用字符串时提到了一个警告(请参阅“不幸的是,至少在 GNU 和 Intel 编译器上,声明”部分)。
最佳答案
问题中的“工作”方法本质上是特定于 Fortran 处理器的。由于历史惯例,它是某些操作系统上的常见安排,但绝不是无处不在。在一个编译器系列中,调用约定的各个方面将随编译选项而变化,并且会以可能破坏该方法的方式随编译器版本而变化。
ISO_C_BINDING 只是一个提供一些常量、一些类型和一些过程的模块。它恰好是由标准指定并由编译器供应商提供的(它是一个内部模块),但除此之外它没有特殊的权力。
这些常量、类型和过程都可以帮助 Fortran 程序员以可移植的方式创建与其 C 对象兼容的数据对象、数据指针和过程指针。一些类型和过程是特殊的 - 因为程序员不一定要通过编写自己的 Fortran 代码来创建它们。
C 的互操作性远不止使用内部模块。将 USE ISO_C_BINDING 放在范围的顶部本身不会改变任何东西,除非使某些标识符可访问。
BIND(C) 属性必须应用于需要在 C 和 Fortran 之间互操作的变量、派生类型、公共(public) block 和过程。在某些情况下,此属性还指定事物的绑定(bind)名称(C 名称)。对于派生类型和通用类型,这可能会改变组件的对齐方式和顺序,而对于过程,它可能会改变过程调用约定的各个方面。
对于可互操作的数据对象和过程的性质,还有一组要求,程序员必须遵守。
(链接的 Fortran 维基页面中的“不幸的是......”评论似乎是对 Fortran 中字符数组赋值方式的误解 - 它与 C 互操作性本身无关,除非要求它是 Fortran 中 LEN=1 的字符数组,可与 C 字符数组互操作。)
如果特定项目的目标编译器套件支持 Fortran 2003 的必要部分,那么我想不出不使用 Fortran 2003 的 C 互操作性功能的正当理由。由此产生的健壮性和可移植性的改进使用此功能生成的代码很有吸引力。
关于c - 为什么是 ISO_C_BINDING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19524714/
我正在编写一些调用 fortran 的 C 代码,但不清楚 iso_c_binding 模块的使用。 我的 Fortran 和 C 接口(interface)在没有 iso_c_binding 的情况
在混合 C/Fortran 应用程序的上下文中,有没有一种方法可以检查编译器是否知道“iso_c_binding”(例如 GCC 4.1.2 不知道,而 4.3.4 知道),就像预编译器一样-处理指令
我正在写 iso_c_binding 在 Fortran 中调用具有以下原型(prototype)的 C 函数 int zmat_run( const size_t inputsize,
我有一个使用 OpenMP 并行化的 Fortran 程序。主函数调用一个 Fortran 函数,该函数包含具有常微分方程的系统的定义。当拆分到不同的线程时,这可以正常运行。我还想要链接到具有类似 O
我正在编写代码,使用 Fortran 的 C 互操作性机制(在 Fortran 2003 中引入并在较新版本的 gfortran 和 ifort 中实现)从 Fortran 调用 C 函数。 This
我正在使用两个 Fortran 模块。第一个包含一个子程序 foo : module fmod1 contains subroutine foo(i) implicit none
我正在尝试获取 Fortran 代码库以使用 ISO_C_BINDING 调用 C 库调用,但我在传递 Fortran 数组时遇到了问题。 我创建了一个简单示例来说明我的问题。 主.f90 progr
如何将 C 字符串数组 (char* cstrings[]) 传递给 Fortran子程序? 问题 Arrays of strings in fortran-C bridges using iso_c
C/C++ 编译器供应商是否也支持 Fortran ISO_C_BINDING 模块的概念?例如,C/C++ int 的大小可能因不同供应商的编译器而异。因此,通过 ISO_C_BINDING 模块,
我想从 Fortran 调用 C 函数并接收在 C 函数中定义的字符串。我搜索过,但到目前为止我找不到一个有效的、直接的答案。 实际上我找到了一个解决方法:接收一个字符数组,然后使用内部函数 tran
我有一个旧的 Fortran 代码,我想将其与新的 C/C++ 程序混合。 Fortran 子例程动态分配一些我想传递给 C 程序的数组。我只会在运行 Fortran 代码后获得这些数组的大小。 在这
我有以下 Fortran 函数 create_pointer,它调用名为 create_pointer 的 C 函数,该函数创建一个指针并返回其地址: FUNCTION create_pointer(
是否可以使用内部 iso_c_bindings 模块为单个 C 函数/过程生成多个 Fortran 2003 接口(interface)? 对于 C 类型参数与 Fortran 参数不完全匹配的情况,
我正在尝试将一个并行 MPI Fortran 程序链接到一个也使用 MPI 的并行 C 库。软件体系结构以 Fortran 为中心,因此我尽量保留 Fortran 方面的内容。 所以我需要将 C 例程
几周前我发布了一个类似的问题 ( iso_c_binding calling C routine with pointers from Fortran with arrays ),我找到了解决问题的方
我正在尝试编写 CMakeLists.txt 以耦合一个简单的 FORTRAN 程序,该程序使用 iso_c_binding 调用 C++ 函数。当我使用 gfortran 作为 FORTRAN 编译
是否有一种工具可以使用 Fortran 2003 标准中的内在 iso_c_bindings 模块,自动从 C 库头生成 Fortan 绑定(bind)? 我对将 C 语言转换为 Fortran 语言
我是一名优秀的程序员,十分优秀!