从 C++ 访问 Fortran 模块的变量
accessing variables of fortran module from c++
目前我正在做一个需要将Fortran代码集成到c ++的项目。在 fortran 模块中声明了许多变量和数组。当相应的 fortran 声明为 real*8 rmax 并且模块名称为 common_area 时,我能够通过将 c 变量声明为 extern double common_area_mp_rmax_ 来访问 c 中的整数、浮点数和双精度类型。但是,当我尝试对数组执行相同的操作时,出现错误。
假设 Fortran 模块中的代码为:实数*8,可分配,维度(:,:,:) :: x
我把一个c双指针写成:
extern "C"
{
double* common_area_mp_x_;
}
现在,当我编译整个项目时,它说"'variable_area_mp_x_'的多重定义"。我正在使用CMake来编译整个项目。有人能说明我做错了什么吗?我是 fortran 的新手,我很难解决这个问题。感谢您的时间和帮助。
谢谢心灵本德
Fortran 2003 将与 C 的互操作性引入到标准 Fortran 语言中。 除非您有充分的理由相反,否则您应该使用此语言功能提供的功能。 有关示例,请参阅此站点上的 fortran-iso-c 绑定标记。
根据当前的Fortran标准(以及下一个标准修订版的草案),Fortran可分配模块变量不能与C变量互操作。
在实现方面,Fortran 编译器将使用描述符来存储可分配变量的分配状态。 此描述符不仅仅是指向数据的指针 - 有关详细信息,请参阅编译器的用户和参考指南中的"处理 Fortran 数组描述符"。
在这种情况下,共享信息的最佳方法取决于您要执行的操作。 一种选择是为可分配数组提供 TARGET 属性,然后具有一个单独的变量 TYPE(C_PTR),该变量带有带有目标 C 地址的绑定标签。 阵列大小等方面需要单独通信。
MODULE common_area
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_DOUBLE
IMPLICIT NONE
...
REAL(C_DOUBLE), ALLOCATABLE, TARGET :: x(:,:,:)
TYPE(C_PTR), BIND(C, NAME='x_ptr') :: x_ptr
CONTAINS
! Call before operating on x_ptr in C++
SUBROUTINE init
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_LOC
ALLOCATE(x(1,2,3))
x_ptr = C_LOC(x)
END SUBROUTINE init
~~~
// After init has been executed, this is a
// pointer to the value of the allocatable module variable
extern "C" double *x_ptr;
给定一个C++文件测试.cpp包含内容
extern "C" { double * foo; }
extern double bar;
double asdf;
使用 GNU 工具
g++ -Wall -c test.cpp; nm test.o
> 0000000000000000 B asdf
> 0000000000000008 B foo
即使用第一个选项实际上引入了具有该名称的新符号。
在这种情况下,正确的选择是
extern double * common_area_mp_x_;
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 尝试导入pybind-opencv模块时出现libgtk错误
- 试图让变量检查数组中的某些内容
- 什么是运行英特尔线程构建模块的 XCode 8 环境变量
- 模块名称是否驻留在单独的"name space"中,或者它们可能与例如变量名称发生冲突?
- 静态变量在不同模块上共享价值
- 如何在LLVM模块中增加全局变量
- Python C 接口,不同的模块共享静态变量
- 从 C++ 访问 Fortran 模块的变量