c - 在 C 中为 fortran 数组分配内存

标签 c fortran

我是 fortran 编程的新手。我有一个 3 维数组,声明如下

REAL*4, DIMENSION(:,:,:), ALLOCATABLE :: a1

我想通过引用 C 或 C++ 函数来传递数组,并在 C 中而不是在 fortran 中分配内存。是否有可能或者我在理解 fortran 中的数组概念时错了?

最佳答案

这取决于您的情况,但可能不是。如果您根据问题标签仅限于 Fortran 90,则绝对不是可移植方式。
请注意,您的 Fortran 变量是 ALLOCATABLE。
正如您所问的,它需要一个实现相对最近发布的技术规范 (TS 29113:2012) 的 Fortran 编译器(和配套的 C 编译器)。您处于语言开发的最前沿 - 当前支持此 TS 的编译器数量很少(如果不是零的话)。预计这个 TS 的内容会被纳入到 Fortran 标准的下一次修订中,所以几年后再试一次,你可能会有更好的运气。
但请注意,TS 限制了 C 可以为 Fortran 分配的方式 - 基本上 C 代码需要调用 Fortran 编译器提供的例程。您不能使用任何旧的分配器(包括 malloc),所以这仍然可能不适合。
但是,Fortran 2003 增加了在 C 中完成 Fortran POINTER(不是您所要求的可分配)内存分配的可能性。C 代码返回一个指向适当大小的内存块的指针,Fortran 过程接收该指针返回为 C_PTR 类型的对象。然后,Fortran 代码调用过程 C_F_POINTER 以将 C_PTR 对象中的 C 地址与 Fortran 指针相关联。 C_PTR 和 C_F_POINTER 是内部 ISO_C_BINDING 模块中的实体。
一个粗略的例子:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_F_POINTER
INTERFACE
  FUNCTION get_some_memory() BIND(C, NAME='get_some_memory')
    IMPORT :: C_PTR
    TYPE(C_PTR) :: get_some_memory
  END FUNCTION get_some_memory
END INTERFACE

! REAL*4 isn't Fortran.  Correct syntax below.
REAL(4), POINTER, DIMENSION(:,:,:) :: a1

! get_some_memory would typically be told how much memory was needed.
! n1, n2, n3 are integer with the relevant extents for each dimension.
CALL C_F_POINTER(get_some_memory(), a1, [n1,n2,n3])

! Equivalent call to free required at some later stage.


void *get_some_memory()
{
  return malloc(some_number_of_bytes);   
} 
除此之外,您还可以玩一些依赖于处理器的(即不可移植的)技巧,但它们不在标准语言范围内。

关于c - 在 C 中为 fortran 数组分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16385372/

相关文章:

c - fgetc() 不返回 '\n' 个字符

c - 从 C 中的串行读取 arduino

c - 什么是 GCC_UNUSED 定义

macos - MATLAB mex 不在 macOS 上寻找编译器 gfortran

r - 使用 R Inline 和 fortran 进行多维数组运算

c - 为什么 main 函数总是加载在同一个地址,而变量大多数时候有不同的地址?

c - GPS代码不读取纬度数据

Fortran:整数到字符串示例

fortran - 将命令行输出保存到 Fortran 中的变量

fortran - 求解二次方程但得到奇怪的错误