问题标签 [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 传递 Fortran 数组
我正在尝试获取 Fortran 代码库以使用 ISO_C_BINDING 调用 C 库调用,但在传递 Fortran 数组时遇到问题。
我创建了一个简单的示例来说明我的问题。
main.f90
函数c
编译行
输出
char 被正确传递,但数组不是,我不知道如何更正它。我见过的例子建议改变
至
但我不能这样做,因为我无法更改库代码来完成这项工作。我只是尝试创建一个新函数来将 avoid*
强制double*
转换为无效:(。同样地更改数组使其不可分配是不可行的。
想法?
c++ - 从 C++ 调用 Fortran 子例程,链接时未定义的引用
我有一个想从 C++ 程序调用的 Fortran 子例程。它需要一长串浮点参数并使用 iso_c_binding 内部模块:
根据我所阅读的内容,我了解到我需要使用 C++ 的“extern”命令来定义外部函数,然后再调用它。我尝试了两种方法。首先:
在编译时返回“字符串常量之前的预期 unqualified-id”,而第二个:
编译得很好,但无法与“未定义的对 'c_parasolve( .... )' 的引用”链接,并且 ld 返回 1。
我正在编译:
等等,以及
让它们进入 .o ELF,然后尝试链接:
调用这个 Fortran 函数的正确方法是什么?
c++ - 使用 Fortran 中的内存数据调用 C 代码
我有一个复杂的 C++ 对象,我想在我的 Fortran 代码中使用它。一般来说,从 Fortran 调用 C++ 代码是没有问题的(例如只需要提供一个合适的 C 链接接口)。
然而,我的问题是我希望我对 C++ 的 Fortran 调用对我称之为持久对象的对象进行操作:由第一个 init 函数创建并由其他 C++ 函数操作的 C++ 对象。
更具体地说,假设我有以下 C++ 代码
以及以下 fortran 代码(假设它是 main() ):
现在在我的真实代码中,它可以编译、链接,有时可以工作,但有时不能:似乎 init_A() 中分配的内存不能被 Fortran 代码保持不变)
我无法在互联网上找到任何相关信息:
- 你知道是否有任何标准机制来确保由 init_A_() 分配的内存保持不变并且仍然由 fortran 代码分配?
- 你知道任何其他适合我的问题的机制吗?
另外,有人可以解释一下为什么没有正确管理内存吗?直到现在,我还以为
Fortran 会向操作系统询问内存,C++ 也是,
操作系统为 Fortan 和 C++ 提供的内存段是不相关的,并且保证不重叠,
如果请求新内存,操作系统不会让 Fortran 使用 C++ 内存,直到 C++ 释放它
C++ 内存通过调用 teardown_A() 或程序(即 Fortran main)终止时释放
编辑:我用 IanH 的答案更新了我的代码,但这仍然不起作用(段错误,在从 Fortran 调用 doSth() 时释放了部分内存
我发布的原始代码如下(供评论参考)
和 Fortran 代码:
c - 如何在 Fortran 中调用 C 函数并正确传递 uint32_t 参数
您好我正在使用 Fortran 90 代码来调用 C 函数。由于我正在处理地址,因此 C 函数的参数应该在 Fortran 中正确匹配。我正在使用 ifort 和 icc 编译代码并在 64 位机器上工作。
一些测试表明这也适用于int32_t
,但为了防止最终出现陷阱,我想保留uint32_t
我正在调用的 C 函数具有以下原型
我不能简单地通过做类似的事情来调用这些函数
这会产生乱码。因此,我正在使用一种解决方法:
随后在 Fortran
很明显,我对参数类型的不匹配有一些问题。不幸的是,我不知道如何解决这个问题。由于在我的解码/编码函数中完成了二进制地址算术,因此保留uint32_t
.
c++ - 在 fortran 77 中使用 C++ 类对象
有没有办法传递 C++ 对象以与 Fortran 77 一起使用?例如:
然后将 myshape 用作 C++ 对象,该对象将保存在 Fortran 使用的内存中,并将其传递给其他实际使用它的 C++ 函数?
编辑:这是 C++ 代码:
c++ - 使用 cmake 将 C++ 和 FORTRAN (mpif90) 与 iso_c_binding 耦合
我正在尝试编写 CMakeLists.txt 来耦合一个简单的 FORTRAN 程序,该程序使用 iso_c_binding 调用 C++ 函数。当我使用 gfortran 作为 FORTRAN 编译器时,代码运行良好,但是当我切换到 openMPI (mpif90) 而不是 gfortran 时,出现错误:
我附上了 gfortran 版本(工作)。为了切换到 mpif90,我只需取消注释 main.f90 中的注释行:
函数.c:
CMakeLists.txt:
我将不胜感激有关此问题的任何帮助。
c++ - 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数
我想从 Fortran 调用一个 C++ 函数。为此,我在 Visual Studio 2010 中创建了一个 FORTRAN 项目。之后,我将一个 Cpp 项目添加到该 FORTRAN 项目中。当我想构建程序时出现以下错误:
以下是 Fortran 程序和 C++ 函数。
Fortran 程序:
C++ 函数:
提前非常感谢。
c++ - 如何在 Visual Studio 2010 中混合 fortran 和 C++?
我正在尝试从 Fortran 主程序调用 c++ 函数。为此,我在 Visual Studio 2010 中按照以下步骤操作:创建 C++ 静态库项目
- 在菜单栏上,选择文件、新建、项目。
- 在“新建项目”对话框的左窗格中,展开“已安装”、“模板”、“Visual C++”,然后选择“Win32”。
- 在中心窗格中,选择 Win32 控制台应用程序。
- 在名称框中指定项目的名称,例如 MathFuncsLib。在解决方案名称框中指定解决方案的名称,例如 StaticLibrary。选择确定按钮。
- 在 Win32 应用程序向导对话框的概述页面上,选择下一步按钮。
- 在应用程序设置页面的应用程序类型下,选择静态库。
- 在“应用程序设置”页面的“附加选项”下,清除“预编译标头”复选框。
- 选择完成按钮以创建项目。
创建可执行的 Fortran 项目
- 在菜单栏上,选择文件、新建、项目。
- 在“新建项目”对话框的左窗格中,展开“已安装”、“模板”、“英特尔(R) Visual Fortran”,然后选择“控制台应用程序”。
- 在中心窗格中,选择空项目。
- 指定项目的名称,然后指定解决方案的名称。在解决方案框中选择“添加到解决方案”。选择确定按钮。
此外,我在 Visual Studio 中进行了一些设置,如下所示:
- 右键单击可执行的 Fortran 项目并选择 Dependencies 以将可执行项目设置为依赖于静态库项目。
- 右键单击可执行项目并选择设置为启动项目,以便您可以构建和调试它。我有以下 Fortran 主程序和 C++ 函数。
Fortran 程序
C++ 函数
当我构建程序时,我会遇到以下错误:
有人可以帮我吗?任何建议将不胜感激。
c - 将 C 字符串数组传递给 Fortran (iso_c_binding)
如何将 C 字符串 ( char* cstrings[]
) 数组传递给 Fortran 子例程?
使用iso_c_binding的 fortran-C 桥中的字符串数组肯定是相关的,但答案似乎不正确,甚至无法使用 GNU Fortran 编译。
我目前正在为 Fortran 代码开发一个 C 接口,我希望iso_c_binding
(我以前使用过)可以让这变得轻而易举。到目前为止,C 字符串数组还没有运气......
Fortran 子例程应将字符串数组作为参数。在普通的 Fortran 中,我会写如下内容:
将单个 C 字符串传递给 Fortran 的一种方法是作为 C 指针 ( c_ptr
) (我知道,我也可以使用 的数组character(kind=c_char)
)
所以,我认为数组c_ptr
是个好主意
但这会产生分段错误。
最后一个示例的 C 代码是
头文件的内容fstring.h
很简单:
我的目标是 GNU Fortran 和 Intel Fortran,并用 GNU Fortran 测试了上述内容。字符串的长度是固定的(上例中为 3),以防这简化了解决方案。但是,数组的维度可以变化。
任何指针(甚至 C 指针)都将不胜感激。
c - 从 fortran 调用 C (ifort, gfortran)
我是一名 C 程序员,必须通过添加对 C 函数的单个调用来更新庞大的 Fortran 2003 程序。
首先,我需要编写一个最小的 Fortran 包装器(在现代、自由格式的 Fortran 中,不要大喊大叫),它将正确调用 C 函数,其中包含一个包含循环计数器(以及日期/时间,如果可能的话)的字符串,从内部一个循环。
这应该很“容易”,但我所做的搜索都没有产生足够的片段让我创建一个工作程序。
我正在使用最新的 64 位版本的 gfortran 和 64 位 Linux 下的 Intel ifort 编译器,测试代码需要使用这两个编译器进行编译。
这是文件 send_to_port.c 中的 C 定义:
添加最后一个参数是为了让 Fortran 不必担心尾随的 null(我在 C 中处理它:data[length] = '\0';)。我知道长度参数是由 Fortran “自动”添加的,因此 Fortran 调用将只有两个参数,整数端口号和要发送的字符串。
我希望使用以下 gfortran 行以及 ifort 的等效代码来编译代码:
我正在寻找最少的代码:我认为它应该在 10-20 行左右,但我不知道 Fortran。这是我当前的 test.f 编辑缓冲区(无法编译):
帮助?