问题标签 [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 投票
2 回答
340 浏览

c - 从 C 调用 Fortran 函数时的 EXC_BAD_ACCESS

我环顾四周,虽然有很多 EXC_BAD_ACCESS 问题,但都没有帮助。

我正在使用 Mountain Lion(我认为是 OSX 10.8?)和 PGI 12。

我似乎无法从 C 中调用 fortran 函数,我写了一个简化的案例,似乎我无法传递整数。

我的fortran函数是:

我的 C 函数是,

建吧。。

(我希望警告不是导致我的问题的原因,PGI 用户论坛对此作出回应,说他们将发送文件的更新版本,但我还没有得到回复。而且不知道为什么 PGI 需要这样许多额外的库要指定)

当我在调试器中运行它时..

我完全迷路了,为什么我不能发送一个int?我试过给一个整数赋值并发送它,没有骰子。我已经尝试将其作为子程序,我尝试过没有返回值.. 没有任何效果。

0 投票
1 回答
2105 浏览

eclipse - 如何在 Eclipse 中编写和编译混合编程语言(C 和 FORTRAN)

基本上,我想在 Ubuntu(Linux 环境)的 Eclipse(并行应用程序开发)IDE 中使用 C 和 FORTRAN 编写混合编程语言。

我的主程序将在 C 中,调用函数将在 FORTRAN 中。现在我应该如何将这个 FORTRAN 源程序链接到 C 项目?

我能够从终端(linux)编写和编译相同的(混合编程),没有任何问题。

0 投票
2 回答
2358 浏览

c++ - 从 Fortran 调用 C 函数,其中 C 函数名称最初是从 C 传入的

由于不相关的原因,我需要将 C/C++ 函数名称传递给 Fortran 子例程,该子例程又调用该 C 函数。我发现我可以成功地将函数名传递到 Fortran 子例程中。在那个子程序中,我可以调用正确的 C 函数。但是,C 函数的参数在此调用中被破坏(当直接从 C 调用时,它工作正常)。我已经使用ISO C Binding来尝试让它工作,但无济于事。

这是一个MWE:

fortranRoutine.h:


从Fortran.h调用:


主.cpp:


fortranRoutine.f90:


从Fortran.cpp 调用:


当前结果

当前运行它会给出:

calledfromFortran对from的第一次调用可以main正常工作,但是从fortranRoutine值调用它时会被破坏。请注意,每次运行时,后一个值都会发生变化。我究竟做错了什么?

0 投票
1 回答
337 浏览

python - Cpython 和 fortran 链表之间的互操作性

我有一个大致类似于的 fortran 链表

理想情况下,我想使用 Cpython 与之交互。我使用 f2py 程序在 python 中使用了 fortran 子例程来创建共享对象。但是,f2py 不能与派生类型一起使用。

我的问题很简单,是否可以使用 cpython 在 Fortran 中访问类似链表之类的东西。我想我需要遵循 fortran 到 c 到 cpython 的路线。但是,我已经读到,对于与 c 互操作的 fortran 派生类型,“每个组件都必须具有可互操作的类型和类型参数,不能是指针,也不能是可分配的。” 同样,后c-fortran 互操作性 - 带有指针的派生类型似乎证实了这一点。

我想知道是否有人知道是否绝对不可能从 cpython 访问 fortran 中的链表。如果可能的话,即使是间接的或迂回的,我也会很感激听到更多。

谢谢你,马克

0 投票
2 回答
447 浏览

fortran - Fortran“参数”类型未包含在编译对象中

我有一个 Fortran 模块,其中包含一些具有属性的变量parameter和一些具有属性的变量save。这些parameter不包含在编译对象中,这在尝试组装库时会成为问题。例如,考虑一个文件testModule.f90

我编译这个:ifort -c testModule.f90。当我检查里面的东西时:

只有thisIsSaved变量在那里。我知道我可以更改thisIsParameteredsave而不是parameter,但理想情况下,我想阻止链接用户更改此值。有没有办法做到这一点?

编辑:我希望这个库也可以被 C 代码访问,而不仅仅是 Fortran。

0 投票
2 回答
2415 浏览

fortran - 在 fortran 程序中调用 METIS API(用 C 语言编写)

两个多星期以来,我一直在努力从我的 fortran 代码中调用一个用 C 编写的METIS库。而且,不幸的是,没有你的帮助,这似乎不是一个快乐的结局。我发现了一些关于直接调用使用接口的帖子。我更喜欢后者,因为我可以监视变量以进行调试。我附上了三个代码。

1.我想使用的c函数
2.fortran接口模块
3.fortran程序

(1)c函数

我删除了 c 函数体。没有必要了解我的问题

这里,idx_t是整数,real_t是单精度或双精度。从neoptions是输入,最后三个参数是输出。并且vwgtvsizetpwgtsoptions可以接收 null 作为默认设置的输入 我编写了使用这样的 c 函数的接口模块

(2) Fortran接口模块

固定的!

  1. 在use 常量下插入use iso_c_bind
  2. nenn和其他变量使用integer(c_int)而不是integer 。
  3. 删除未使用的模块常量

.

这是我调用该函数的程序代码

(3) Fortran程序

固定的!

  1. npart的分配大小是固定的。不是ne而是nn
  2. 添加 opts(7)=1 以获得 epart、npart 的 Fortran 样式数组(直到现在才生效)

.

但问题是我收到如下错误消息,尽管我为 tpwgt 设置了 null。

输入错误:约束 0 的 tpwgts 的 0.000000 总和不正确。

这条消息在下面的代码中处理。

无论如何,为了看看如果我为 tpwgts 放置一个数组而不是 null 会得到什么,tpwgts(:) = 1.0/nparts,这使得 tpwgts 的总和等于 1.0。但我得到了与1.75相同的消息。

这些是我的问题
1. 我是否使用 null() 正确传递参数?
2. 我必须将所有参数的指针传递给 c 函数吗?那怎么办?
3. 将整数放入 opts(0:39) 是否足够使用?例如,在没有“接口模块”的帖子中,使用了像 options(3)=1 这样的简单代码。但在 c 代码中,options 有 16 个命名变量,如 options[METIS_OPTION_NUMBERING]、options[METIS_OPTION_UFACTOR]。我认为设置选项是必要的,但我不知道。4. 有没有 METIS fortran 的例子?

任何形式的提示/建议都会对我有很大帮助。谢谢你。

结论

我遇到的问题是c 函数无法从 fortran 代码中识别空指针。

接口模块中有一些变量的错误声明(请参阅“已修复”和评论)

看起来代码工作正常。但是fortran 样式输出的option(7) = 1不起作用,现在我正在研究它。

0 投票
0 回答
344 浏览

c - 传递数组中的访问冲突错误

在为我之前提出的问题找到答案之前,我为非常小的网格(只有两个三角形)编写了非常简单的代码,如下所示在 fortran 中调用 C 函数。为了代码的简单。这里既没有使用接口模块,也没有使用 iso_c_binding(as possible)。和这篇文章很相似,还有一个错误。

由于eind ,它给出了访问冲突错误。如果传递c_null_ptr而不是eind,它无论如何都会运行。数组eind的大小和元素个数是一致的。如何修复?=>已解决。谢谢!

我遇到的问题是调用 METIS_PartMeshNodal 时出现系统税错误,第二个参数是 ne,与第一个参数 ne 相同。应该是nn
解决方案是将第二个参数替换为nn。上面的代码可以编译执行。

注意:由于 METIS 的方案,太小的网格可能没有合理的解决方案。
请参考另一篇文章以使用接口模块。

0 投票
1 回答
2531 浏览

c++ - 在具有 2003 ISO C 绑定的 Visual Studio 2010 中从 Fortran 调用 C++ 函数

我必须从我的 fortran 程序中调用一个 C++ 函数。我正在使用 Visual Studio 2010。我在本书http://www.amazon.com/Guide-Fortran-Programming-Walter-Brainerd/dp/1848825420中阅读了有关 2003 ISO C 绑定的相关章节。我尝试编译并运行第 219 页的简单示例(我在下面复制了它),但它显示“错误 LNK2019:未解析的外部符号 _c 在函数 _MAIN__ 中引用”。这些是我遵循的步骤。

1)我用Fortran主程序和模块创建了一个Fortran项目,并将其设置为“启动项目”。

2)我创建了一个“静态库”类型的 C++ 项目。

3)我添加了 $(IFORT_COMPILERvv)\compiler\lib\ia32 在这里解释http://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications

当我编译时,我得到了那个错误。如果我评论 Call C 行,它会完美运行,所以它找不到 C 函数。有什么建议吗?提前致谢。以下是 C 和 Fortran 代码:

0 投票
1 回答
706 浏览

fortran - 在 Fortran 中如何分配 c_ptr?

给定一个 Fortran 派生类型,其字段为 c_ptr(来自 iso_c_binding)和两个变量 A 和 B 的所述类型,如何定义赋值 A = B?如果指针是 fortran 指针,它们实际上会在赋值期间被取消引用。c_ptr 也一样吗?

0 投票
1 回答
555 浏览

c - 将 Fortran/C 程序从 32 位升级到多架构

我正在查看一个稍旧的 Fortran 程序,它带有适用于 32 位系统的 C 调用,但会引发对 64 位编译器的警告和担忧。该程序将指向动态分配内存的 C 指针的地址存储为int,在 Fortran 端共享为INTEGER。我担心的是,在 64 位整数系统上,来自 C 指针的转换可能大于可以存储为int/的值INTEGER。我已经使用两个文件将现有程序简化为这个示例。

Fortran: this.f

C:that.c

编译

-m32该程序可以使用32 位(这里没有问题)和-m6464 位的 GNU 编译器进行编译。编译 C 代码会引发一些警告:

而其余的编译和链接都很好,并且程序可以正常工作:

问题

虽然我看到calloc返回的地址可以满足 4 字节整数的数据限制,但是否存在calloc返回更大整数地址的风险?强制转换(intptr_t)将使编译警告静音,但我怀疑如果尝试将指针强制转换为截断地址,它将截断任何更高位和“分段错误”。它是否正确?

我该怎么办?修复需要在 Fortran 代码上进行吗?