问题标签 [fortran-iso-c-binding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 通过更改 makefile 来组合 FORTRAN 和 C
我有一个 FORTRAN 代码,它调用 C 例程来计算度量。FORTRAN 代码是:
c 函数如下所示:
为了加入 c 和 fortran,我需要在我的 makefile 中包含一个 Makefil.lib。我这样做了,并准备了我的makefile,如下所示:
但是当我成功时,我收到了这条消息:
你能帮我解释一下为什么会出现这个错误吗?非常感谢。
c - 如何在 C 中访问(动态分配的)Fortran 数组
我的主要问题是为什么数组会做如此奇怪的事情,以及是否有任何方法可以以“干净”的方式执行以下操作。
我目前有一个 C 程序通过foo.c
连接 Fortran 程序,大致如下面的代码所示:bar.f90
dlopen/dlsym
富.c:
bar.f90:
运行主要产量
这表明 Fortran 正确地分配了数组,甚至正确地存储了给定的值,但是它们不再可以通过 dlsym 访问(处理该数据会导致段错误)。我也对固定大小的数组进行了尝试——结果保持不变。
有谁知道这种行为的原因?就我个人而言,我希望事情要么双向解决,要么根本不解决——这个“Fortran 接受 C 数组,但反之不行”让我想知道我在以这种方式从 C 访问数组时是否犯了一些基本错误。
另一个(甚至更重要的)问题是,如何以“正确的方式”进行数组访问。目前我什至不确定坚持“Fortran as .so”界面是否是一个好方法——我认为在这种情况下也可以尝试混合编程。尽管如此,数组问题仍然存在 - 我读到这可以使用 ISO C 绑定以某种方式解决,但我不知道如何解决(我还没有使用 Fortran 进行很多工作,尤其是没有使用所述绑定) ,所以在这个问题上的帮助将不胜感激。
编辑:
好的,所以我更多地阅读了 ISO C Binding 并在这里找到了一个非常有用的方法。使用C_LOC
我可以获得指向我的 Fortran 结构的 C 指针。不幸的是,指向数组的指针似乎是指向指针的指针,需要在 C 代码中取消引用,然后才能将它们视为 C 数组 - 或类似的东西。
编辑:
至少在大多数情况下,我的程序现在可以按照 Vladimir F 指出的方式使用 C 绑定来工作。C 文件和 Fortran 文件现在链接在一起,所以我可以避免使用 libdl 接口,至少对于 Fortran 部分 - 我仍然需要加载动态 C 库,获取指向其中一个符号的函数指针并传递它作为指向 Fortran 的函数指针,后者随后将该函数作为其计算的一部分调用。正如所说的函数需要 double*s [arrays],奇怪的是,我无法使用 C_LOC 传递我的 Fortran 数组 - 既没有C_LOC(array)
也没有C_LOC(array(1))
将正确的指针传递回 C 函数。array(1)
虽然成功了。可悲的是,这不是做到这一点的“最干净”的方式。如果有人提示我如何使用C_LOC
功能,那就太好了。尽管如此,我接受 Vladimir F 的回答,因为我认为这是更安全的解决方案。
c - 检查 iso_c_binding 在编译时是否可用
在混合 C/Fortran 应用程序的上下文中,有没有办法检查编译器是否知道“iso_c_binding”(例如 GCC 4.1.2 不知道,而 4.3.4 知道),如预处理指令或者其他的东西?我不能简单地检查 GCC 的版本,因为我可能会使用其他编译器。
谢谢
c - 从 void 转换为 MPI_Aint
我在将一些变量从 void* 转换为 MPI_Aint 时遇到了一些麻烦。这是代码的一部分:
mmap 正在工作但出现错误(当我评论最后一行时没有错误)
有什么想法可以帮忙吗?以下是完整的 C 函数代码:
c++ - 在 C++ 和 Fortran 代码之间传递复数数组
我正在使用 C++ 和 Fortran 代码。C++ 代码需要调用 Fortran 子例程。Fortran 子例程的一个参数具有 Fortran 类型complex
。
C++ 代码在一个文件中,而 Fortran 代码子例程在另一个文件中。我正在使用64 位gcc
系统。gfortran
GNU/Linux
这是一个显示 Fortran 子例程声明的片段(以及一些附加行):
在 C++ 文件中,我知道传递给 Fortran 代码的参数需要通过引用传递,而不是通过值传递。Fortran 子例程在 C++ 代码(在源代码文件的顶部)中使用extern
关键字声明为函数。
但是,函数的最后一个参数是一个复杂的 C 数组。怎么可能:
- 为 C/C++ 中的复杂数组分配内存以作为
phi
参数传递? - 将数组作为参数传递给 Fortran 子例程,以便 Fortran 代码可以使用内存?
c - 如何从 fortran 访问 C 指针?
我将值分配给状态数组,如下所示:
状态[i] += 1;
我喜欢从 fortran
访问这个数组我怎样才能访问这个数组?
例如,我想从 fortran 中更改 STAT 的值,如下所示:
统计(2)=3
这可能吗?
c源
源代码
我已经测试过这段代码,我参考了这个问题的好答案。但是当我尝试这样做时出现分段错误错误:
你能认出这是怎么回事吗?
c - c-fortran 互操作性 - 带指针的派生类型
我有很长的 fortran 代码,必须从 python 中使用。我决定做 Fortran->C->Python 接口。
我遇到了一个问题:我在 Fortran 模块中派生了包含
键入为成员。
当尝试使用 ifort 编译时,我得到(使用 gfortran 类似的东西):
这实际上与 Intel 编译器文档和 Fortran 2003 标准一致:第 15.2.5 点。
有什么方法可以访问内部带有可分配或指针的 Fortran“类型”?
c - 可以使用数组参数从 Fortran 调用标量 C 函数吗?
我最近遇到了一种情况,我想从 Fortran 调用一个 C 函数,因为一个有用的 C 代码片段。为了方便数组操作,我也希望能够使用数组参数调用这个函数,但它只接受标量参数。
在 Fortran 中,当然可以简单地声明一个过程来elemental
实现这一点,并且可以声明一个 C 过程的接口bind(C)
。但是,由于 C 没有基本过程的概念,因此 Fortran (2008) 标准排除了这种组合:
C1246 基本过程不应具有 BIND 属性。
那么,这个功能可以在 Fortran 中实现吗?
c++ - 如何将字符串数组从 C 和 Fortran 传递到 Fortran?
我正在尝试将字符串数组从 C 传递到 Fortran 子例程,以及从 Fortran 传递到同一个 Fortran 子例程。我已经成功地从 C 和 Fortran 传递了单个字符串(即一维字符数组)。但是,我遇到了字符串数组的问题。我在 Fortran 端使用 ISO C 绑定,理想情况下我希望这在调用端尽可能无缝。
我已经阅读了一些相关的问题和答案。有些(即this和this)只是“使用 ISO C”而没有进一步的细节,这没有多大帮助。这个答案非常有帮助(对不同问题的类似答案),但仅适用于单个字符串,其中似乎 c_null_char 在单个 Fortran 字符串中被识别。如果没有两个单独的例程,我无法弄清楚如何处理数组案例。
我目前拥有的是一个 C 例程,我想从以下位置传递字符串数组 ( string
):
并且,一个类似的 Fortran 例程:
到目前为止,这是我为接收端所拥有的:
这适用于 C 函数;我得到这个输出:
但是,当它通过 Fortran 完成时,我会胡说八道:
这种方法似乎没有c_null_char
。
那么,如何编写一个 Fortran 子例程来接收来自 C 和 Fortran 的字符串数组?
c - C+Fortran 为什么选择 sigsegv?
我在 Fortran 和 C“master”中有以下代码。它提供了 sigsegv,但我不明白为什么。它应该从主 C 程序中获取一个指针,将其转换为 Fortran 指针格式,并读出 C 指针指向的数据。没什么特别的,但仍然是 SigSegv。顺便说一句,这是我看到的唯一方法来规避 Fortran 多维数组与...之间缺乏互操作性(是的,C 没有多维数组)。
Fortran 部分:
C部分:
SIGSEGV 出现在print *,i,j,a(i,j)
Fortran 部分的行
编辑:我已将 "integer*8" 改回 "integer" 并改do i=1,10
回do i=1,5
. 对于这个版本,问题仍然有效
i=1 和 j=1 时出现 SIGSEGV