如何解决通过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)
,则编译失败,并出现以下错误
但是在这个例子中我没有出错,并且得到了像行为一样的intent(inout)
。是iso_c_binding
的一种魔术,其中intent
的限制得到了缓解,还是只是一种未定义的行为,我幸运地获得了所需的功能?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。