通过INTENTIN通过ISO_C_BINDING将Fortran POINTER传递给C

问题描述

在阅读代码时,我不知何故在iso_c_binding上遇到了一个相当奇怪的语法,其最小视图如下所示。

(Fortran部分)

program testF
  use iso_c_binding
  implicit none
  interface
    subroutine get_value_array(arr,num) bind(C)
      use iso_c_binding
      implicit none
(*)   integer(C_INT),dimension(:),pointer,intent(in) :: arr
      integer(C_INT),value,intent(in)                 :: num
    end subroutine
  end interface

  integer(C_INT),pointer :: array
  integer(C_INT) :: n

  n = 7
  allocate(array(n))

  call get_value_array (array,n)

  print *,'array'
  print *,array

end program

(C ++部分)

#include <iostream>

extern "C" void get_value_array(int **in,int num) {
  int i;
  for (i = 0; i < num; i++) {
    (*in)[i] = i+1;
  }
}

使用以下命令编译后,

icc -c testC.cpp
ifort -lstdc++ -o test testF.f90 testC.o
rm *.o

代码实际上可以正常工作并显示所需的输出

 array
           1           2           3           4           5           6
           7

我的问题全都是关于我在代码的Fortran部分用(*)标记的行。要学习iso_c_binding的知识,我搜索了漂亮的网页色调,stackoverflow文献等等。但是,我从未见过这样的语句,其中integer(C_INT) + dimension(:) + pointer一行出现。根据代码,它应该表示'指向int * 的指针'

但是您知道,在iso_c_binding上下文中,单独的integer(C_INT)在C ++透视图中表示int *,而integer,pointer在Fortran透视图中表示“指向整数数组的指针”。既然它们混合在一起,那真是令人困惑。有人可以澄清一下'指向int * 的指针'的含义吗?

再说一次,在(*)中我只写了intent(in)。以我的经验,如果仅在需要intent(in)的地方写intent(inout),则编译失败,并出现以下错误

错误#6780:带有INTENT(IN)属性的伪参数不应被定义也不能被定义。

但是在这个例子中我没有出错,并且得到了像行为一样的intent(inout)。是iso_c_binding的一种魔术,其中intent的限制得到了缓解,还是只是一种未定义的行为,我幸运地获得了所需的功能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)