问题标签 [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.

0 投票
3 回答
955 浏览

c - 通过更改 makefile 来组合 FORTRAN 和 C

我有一个 FORTRAN 代码,它调用 C 例程来计算度量。FORTRAN 代码是:

c 函数如下所示:

为了加入 c 和 fortran,我需要在我的 makefile 中包含一个 Makefil.lib。我这样做了,并准备了我的makefile,如下所示:

但是当我成功时,我收到了这条消息:

你能帮我解释一下为什么会出现这个错误吗?非常感谢。

0 投票
2 回答
3495 浏览

c - 如何在 C 中访问(动态分配的)Fortran 数组

我的主要问题是为什么数组会做如此奇怪的事情,以及是否有任何方法可以以“干净”的方式执行以下操作。

我目前有一个 C 程序通过foo.c连接 Fortran 程序,大致如下面的代码所示:bar.f90dlopen/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 的回答,因为我认为这是更安全的解决方案。

0 投票
2 回答
1163 浏览

c - 检查 iso_c_binding 在编译时是否可用

在混合 C/Fortran 应用程序的上下文中,有没有办法检查编译器是否知道“iso_c_binding”(例如 GCC 4.1.2 不知道,而 4.3.4 知道),如预处理指令或者其他的东西?我不能简单地检查 GCC 的版本,因为我可能会使用其他编译器。

谢谢

0 投票
2 回答
1043 浏览

c - 从 void 转换为 MPI_Aint

我在将一些变量从 void* 转换为 MPI_Aint 时遇到了一些麻烦。这是代码的一部分:

mmap 正在工作但出现错误(当我评论最后一行时没有错误)

有什么想法可以帮忙吗?以下是完整的 C 函数代码:

0 投票
1 回答
1336 浏览

c++ - 在 C++ 和 Fortran 代码之间传递复数数组

我正在使用 C++ 和 Fortran 代码。C++ 代码需要调用 Fortran 子例程。Fortran 子例程的一个参数具有 Fortran 类型complex

C++ 代码在一个文件中,而 Fortran 代码子例程在另一个文件中。我正在使用64 位gcc系统。gfortranGNU/Linux

这是一个显示 Fortran 子例程声明的片段(以及一些附加行):

在 C++ 文件中,我知道传递给 Fortran 代码的参数需要通过引用传递,而不是通过值传递。Fortran 子例程在 C++ 代码(在源代码文件的顶部)中使用extern关键字声明为函数。

但是,函数的最后一个参数是一个复杂的 C 数组。怎么可能:

  1. 为 C/C++ 中的复杂数组分配内存以作为phi参数传递?
  2. 将数组作为参数传递给 Fortran 子例程,以便 Fortran 代码可以使用内存?
0 投票
1 回答
1243 浏览

c - 如何从 fortran 访问 C 指针?

我将值分配给状态数组,如下所示:

状态[i] += 1;

我喜欢从 fortran
访问这个数组我怎样才能访问这个数组?
例如,我想从 fortran 中更改 STAT 的值,如下所示:

统计(2)=3

这可能吗?

c源

源代码

我已经测试过这段代码,我参考了这个问题的好答案。但是当我尝试这样做时出现分段错误错误:

你能认出这是怎么回事吗?

0 投票
1 回答
848 浏览

c - c-fortran 互操作性 - 带指针的派生类型

我有很长的 fortran 代码,必须从 python 中使用。我决定做 Fortran->C->Python 接口。

我遇到了一个问题:我在 Fortran 模块中派生了包含

键入为成员。

当尝试使用 ifort 编译时,我得到(使用 gfortran 类似的东西):

这实际上与 Intel 编译器文档和 Fortran 2003 标准一致:第 15.2.5 点。

有什么方法可以访问内部带有可分配或指针的 Fortran“类型”?

0 投票
1 回答
308 浏览

c - 可以使用数组参数从 Fortran 调用标量 C 函数吗?

我最近遇到了一种情况,我想从 Fortran 调用一个 C 函数,因为一个有用的 C 代码片段。为了方便数组操作,我也希望能够使用数组参数调用这个函数,但它只接受标量参数。

在 Fortran 中,当然可以简单地声明一个过程来elemental实现这一点,并且可以声明一个 C 过程的接口bind(C)。但是,由于 C 没有基本过程的概念,因此 Fortran (2008) 标准排除了这种组合:

C1246 基本过程不应具有 BIND 属性。

那么,这个功能可以在 Fortran 中实现吗?

0 投票
3 回答
3345 浏览

c++ - 如何将字符串数组从 C 和 Fortran 传递到 Fortran?

我正在尝试将字符串数组从 C 传递到 Fortran 子例程,以及从 Fortran 传递到同一个 Fortran 子例程。我已经成功地从 C 和 Fortran 传递了单个字符串(即一维字符数组)。但是,我遇到了字符串数组的问题。我在 Fortran 端使用 ISO C 绑定,理想情况下我希望这在调用端尽可能无缝。

我已经阅读了一些相关的问题和答案。有些(即thisthis)只是“使用 ISO C”而没有进一步的细节,这没有多大帮助。这个答案非常有帮助(对不同问题的类似答案),但仅适用于单个字符串,其中似乎 c_null_char 在单个 Fortran 字符串中被识别。如果没有两个单独的例程,我无法弄清楚如何处理数组案例。

我目前拥有的是一个 C 例程,我想从以下位置传递字符串数组 ( string):

并且,一个类似的 Fortran 例程:

到目前为止,这是我为接收端所拥有的:

这适用于 C 函数;我得到这个输出:

但是,当它通过 Fortran 完成时,我会胡说八道:

这种方法似乎没有c_null_char

那么,如何编写一个 Fortran 子例程来接收来自 C 和 Fortran 的字符串数组?

0 投票
1 回答
199 浏览

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,10do i=1,5. 对于这个版本,问题仍然有效

i=1 和 j=1 时出现 SIGSEGV