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

c - 无法链接小型 C 和 Fortran 程序

我有一个小型 C 程序,我想链接到一个小型 Fortran 程序,但得到链接器错误undefined reference to fibonacci_array

Fortran 代码:

C代码:

生成文件:

错误信息:

0 投票
2 回答
338 浏览

arrays - 如何将数组从 Fortran 返回到 C?

我想知道使用 Fortran 中的 ISO C 绑定将数组从 Fortran 返回到 C 的正确方法是什么。

0 投票
2 回答
382 浏览

c++ - 为什么这种将指针从 C++ 传递到 Fortran 的尝试不起作用?

我需要将一个动态数组从 c++ 传递给 Fortran。我做了很多研究来整理一个我认为应该有效的例子,但事实并非如此。该程序应在 c++ 程序中创建一个数组,将该数组的指针传递给 Fortran 例程,将 C 指针转换为 Fortran 指针,然后在 Fortran 端打印该数组。

我的 C++ 主程序:

我的 Fortran 例程:

我将其构建为:

但是当我运行它时,它不是打印数组值,而是说:

我对指针的想法很陌生,所以我想我不明白它们是如何正常工作的。您能否指出为什么我在运行此程序时会出现此内存错误?

0 投票
2 回答
410 浏览

c - 无法将数组从 FORTRAN 传递到 C

我正在尝试将 FORTRAN 程序中的一维数组传递给 C。

C 函数被调用,但它保存的值是垃圾。但是,如果我尝试使用整数变量调用相同的函数,我可以传递所需的值。谁能帮我解决这个问题?

我使用的代码与此类似

文件:fortran_prog.f

文件:c_prog.c

0 投票
1 回答
1814 浏览

interop - 为什么使用 BIND(C, NAME="name") 属性时我的 fortran 函数没有导出

我习惯使用以下语法

在 .dll 中生成导出函数 依赖行者

所以现在我正在ISO_C_BINDING使用以下代码尝试新的

但是没有创建导出功能

依赖行者

那么我在这里错过了什么?新的iso_c_binding将如何替换已弃用的!DEC$ ATTRIBUTE DLLEXPORT声明?

PS。我通过 VS2010 在 Win7-64 平台上使用 Intel Fortran XE 2013。

0 投票
1 回答
333 浏览

c - 为什么 print 语句会改变 gzread 行为?

我正在尝试使用zlib 库中的 C 函数 gzopen、gzread 和 gzclose 在 Fortran 中读取 gzip 文件。我的子例程在包含 print 语句时可以正常工作,但在Z_STREAM_ERROR (-2)没有它时给出了 a 。是什么导致这种情况发生,我该如何解决?

我在 CentOS 上编译:

并且数据文件可在此站点获得。

0 投票
2 回答
1275 浏览

c++ - Fortran functions with C interface result in undefined references when they try to call each other, why?

I have an old fortran code, for various reasons I am modifying it to provide functionality using c++.

In this code there are two functions, CALC and CALC2. These functions need to be called from the c++ and they call each other.

A sketch of CALC:

A sketch of CALC2:

My current main.cpp:

Running my make file everything compiles properly, but come the link phase I get this:

Why is this the case and how do I fix it?

0 投票
1 回答
1524 浏览

c - 在 Fortran 派生类型中保存指向 C 函数的指针

我有一个从 C 程序调用的 Fortran DLL,我的一个程序需要定期调用由 C 程序提供的回调函数。我目前让它以其“简单”形式运行良好,但我希望能够将我的回调指针存储在派生类型中,以便可以更轻松地在我的 Fortran 代码中传递它。到目前为止,我尝试过的任何方法似乎都不起作用。

首先,这是我目前所拥有的,这确实有效:

从 C(OK,实际上是 C++)程序开始,回调的标头原型是:

Fortran 调用的原型是:

实际的回调函数是:

从 C++ 对 Fortran 代码的调用是:

其中m_image是一个图像数据数组,它是当前对象的成员属性。发生的情况是 C++ 将原始图像数据传递给 Fortran DLL 并要求 Fortran 处理它,由于这需要很长时间,Fortran 会定期更新图像缓冲区并调用回调来刷新 GUI。无论如何,转到 Fortran 方面,我们为 C 回调定义了一个接口:

并定义我们的主要 Fortran 例程:

在主程序的某个地方,我们称之为子程序foo

...其中foo定义为:

正如我所说,所有这一切都运作良好,并且已经这样做了很长时间。

现在对于我尝试过但不起作用的事情:

天真的方法,只是将参数复制到结构的字段中

我希望这能奏效,因为我所做的只是将原始元素复制到没有修改的结构中。C 端没有任何变化,Fortran 主函数的定义和c_callback. 我所做的只是创建一个新的 Fortran 派生类型:

然后在我的主函数中,我用从 C 应用程序接收到的值填充它:

子例程 foo 稍作修改,现在它在结构中查找回调和 C 对象:

这在调用“访问冲突读取位置 0xffffffffffffffff”时失败。

使用更多 iso_c_binding 功能的复杂方法

C 端也没有任何变化,但我修改了主函数的 Fortran 端以接收回调c_funptr

我像以前一样定义了抽象接口subroutine c_callback,尽管我已经尝试了保留bind(c)它的一部分并省略它。调用子例程的主函数中的代码foo现在是:

...子例程 foo 本身仍然像前面的例子一样定义。

不幸的是,这与前面的示例完全相同。

我假设有一个正确的语法来实现我在这里想要实现的目标,我将非常感谢任何建议。

0 投票
1 回答
308 浏览

macos - 在 OS X 10.8 上使用 gfortran 对函数指针进行非法文本重定位

我在通过自制软件安装了 Xcode 5.0.2 和 gfortran 4.8.2 的 OS X 10.8 系统上收到以下错误消息。

f03_iso_c.f03 的内容是

任何解决此错误的帮助将不胜感激。

0 投票
1 回答
235 浏览

c - 将 fortran-iso-c-binding real 变量转换为 real

使用 fortran-iso-c-binding 我可以接口 C 函数并获取类型的变量,例如

但是在程序的其余部分我想使用基本类型(仅仅是因为我不想real(c_float)仅仅因为一个接口函数而用变量替换许多实变量)

是否有一种安全、平台/编译器独立且可靠的方法如何将 fortran-iso-c-binding 类型转换回 fortran(原始)类型?等价于 REAL()