问题标签 [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 - ISO_C_BINDING:对性能/优化的影响
在具有派生数据类型的 MPI 的上下文中,有人告诉我在使用该bind(C)
构造时要小心,因为它会抑制编译器的某些优化。考虑这个(不太可能的例子):
如果没有该bind(C)
语句,编译器可能会重新排序结构并将两个整数分组以更好地对齐。特别是对于大型结构和尝试使用自动矢量化时,这将是有益的。
使用bind(C)
,这种重组是不可能的(为了保持与 的兼容C
,编译器可能不会优化那么多)。如果所有元素都与单词对齐,这将导致大量内存消耗(三个单词而不是两个单词),或者导致对齐丢失。(至少,有人告诉我。)
直到最近,我从未混合过 C 和 Fortran,也从未将派生类型用于 MPI 通信。在不久的将来,我将研究混合语言编程,这些问题似乎很重要。
所以我的问题有两个:
bind(C)
:这种错位是否在“现实世界”应用程序中起作用?有没有人在这里遇到过性能/优化问题?iso_c_binding
:(另外)使用该模块时是否还有其他陷阱iso_c_binding
?对代码施加了哪些限制以及禁用了哪些优化?
c - 将可分配数组从fortran传递给C并对其进行malloc
我正在将我们的一些 Fortran 库代码转换为 C,以便我们最终拥有带有 Fortran 包装器的 C 函数。我们正在使用 Fortran 95。
处理可分配数组的首选方法是什么?
我可以将可分配数组传递给 C 函数并在 C 函数中对其进行 malloc 吗?(C 函数知道要分配的大小)
在 fortran 程序中,我可以取消分配在 C 函数中分配的东西吗?因此,最终客户端 fortran 应用程序要么释放数组,要么需要调用释放内存的 C 函数。
一个小例子或一个链接将不胜感激。
c++ - 混合 C++ 和 Fortran 链接问题
我在网上做了一些搜索,但我找不到如何从 linux 编译简单的 C++ 和 Fortran 代码。我需要让它变得复杂,但我只需要知道如何从一个简单的例子开始。
我的 C++ 代码是这样的:
我的 Fortran 代码是这样的:
我正在使用ifort
为 C++ 代码编译我的 Fortran 代码和 g++。我试过这个终端命令:
但是我得到的错误是“链接器输入文件未使用,因为链接未完成”。我不确定如何将两者联系在一起。如果有人可以帮助我,我将不胜感激!
PS - 我尝试-lg2c
在编译行末尾添加,但无法识别。
c - 如何在c中使用fortran模块子例程
我正在尝试在 c 中使用 fortran 模块子例程并且无法通过,这是我的问题的简化版本:
我有一个包含子例程的 fortran 模块,第二个子例程使用该模块。
现在我想sb
在c中调用函数:
我应该如何将它们链接在一起?
我尝试了类似的东西
但它给出了错误
sb.o: 在函数
sq': sb.f90:(.text+0x6): undefined reference to
add1' /tmp/icc40D9n7.o: 在函数main': main.cpp:(.text+0x2e): undefined reference to
sb'
有谁知道如何解决这个问题?
compiler-errors - 编译错误:未找到“_for_stop_core”
我正在尝试编译调用 fortran 子例程的 ac 代码,但总是出错。
这是fortran代码:
这是c代码
当我编译它们时
我收到错误
当我编译它们时
我收到错误
那么为什么会出现这些错误以及如何解决它们呢?
我知道在 ibm 编译器中有一个选项“-lxlf90”,它告诉 c 编译器链接 fortran 库,这解决了“_for_stop_core”错误。intel c 编译器中是否有类似的选项?
c - 为什么选择 ISO_C_BINDING
我正在编写一些 fortran 调用 C 代码,但不清楚 iso_c_binding 模块的使用。
我有 fortran 和 C 接口在没有iso_c_binding 的情况下成功运行,问题是我是否仍应显式绑定函数和变量。例如,这有效:
因此,将下划线添加到 C 函数中,为其编写接口,然后从 fortran 程序中调用它。我不使用指针或可分配对象,我所有的代码都有需要从 fortran 子例程移动到 C 的 int、char、float 和逻辑。
iso_c_binding 的确切用途是什么?有什么陷阱吗?例如,这提到了通过绑定使用字符串时的警告(请参阅“不幸的是,至少在 GNU 和 Intel 编译器上,声明”部分)。
c++ - 从 C++ 拦截 Fortran STOP
我为旧版 Fortran 库准备了一个 C++ 接口。
遗留库中的一些子例程遵循丑陋但可用的状态代码约定来报告错误,我使用这样的状态代码从我的 C++ 代码中抛出一个可读的异常:它工作得很好。
另一方面,有时遗留库调用STOP
(终止程序)。即使病情可以恢复,它也经常这样做。
我想从 C++ 中捕捉到这一点STOP
,但到目前为止我还没有成功。
以下代码很简单,但准确地代表了手头的问题:
Fortran 遗留库fmodule.f90
:
C++ 接口main.cpp
:
编译行(GCC 4.8.1 / OS X 10.7.4;$
表示命令提示符):
运行:
我怎么能捕捉到STOP
,比如说,请求另一个号码。请注意,我不想接触 Fortran 代码。
我试过的:
std::atexit
:一旦我进入它就不能“回来”std::signal
:STOP
似乎没有发出我可以捕捉到的信号
c - C 可变参数函数和 Fortran 的互操作性
有没有办法声明一个 C 可变参数函数并从 Fortran 调用它?我需要调用这个函数来计算用字符串标记的向量之间的一些点积。我的想法是声明如下内容,其中参数的变量列表包含字符串文字。如果参数的变量列表为空,那么我会在标准标签中查找并执行计算。如果用户指定了两个标签,我将检索这两个向量并得到他们的点积:
唯一的问题是我可以编译我的 C 库并将其链接到 Fortran 可执行文件,但是当我尝试访问参数的变量列表时出现运行时错误。知道我想做的事情是否可行吗?一个可能的解决方案是拆分为两个函数:一个执行标准标签查找(0 参数情况),另一个处理非标准标签查找(2 参数情况)。我宁愿避免这种解决方案。
c - ISO_C_BINDING 和 OpenMP 的问题
我有一个使用 OpenMP 并行化的 fortran 程序。主函数调用一个 Fortran 函数,该函数包含具有常微分方程的系统定义。当跨不同线程拆分时,这运行正常。我还想要链接到具有类似 ODE 定义的 C 文件的选项,当我不使用 OpenMP 时,我可以让它运行。使用 OpenMP 时,ODE 计算不正确。
pointers - diffptr_t fortran 与 iso_c_bindings
我想在 fortran 中有一种带有 iso_c_bindings 的 diffptr_t。内存距离结果必须是有符号整数。
编译错误:
谢谢