Fortran与C语言指针编译问题
-
我的想法很简单,假设fortran有2个指针a,b,我想通过C语言来将指针a=b,因为这样我可以通过C_F_FORTRAN函数改变指针的维度,fortran不支持大维度指针指向小维度。因为我用的是double指针,可以在使用的时候,神威的fortran指针居然只偏移4位?而不是8位?得出来的结果是错的,但是同样的代码却在x86上没问题?这是什么原因呢?
main.f90: program nekotn use ISO_C_BINDING INTERFACE subroutine C_ASSIGN_ARRAY_TO_FORTRAN(cdoublearray,fmyarray) & BIND(C,NAME='C_ASSIGN_ARRAY_TO_FORTRAN') use ISO_C_BINDING TYPE(C_PTR)::cdoublearray real(C_DOUBLE),target::fmyarray(*) end subroutine end INTERFACE real(C_DOUBLE),allocatable,target::a(:) real(C_DOUBLE),pointer::p(:,:) real(C_DOUBLE),pointer::p1(:,:) real(C_DOUBLE),pointer::p2(:,:) TYPE(C_PTR):: cdoublearray allocate(a(20)) call C_ASSIGN_ARRAY_TO_FORTRAN(cdoublearray,a) CALL C_F_POINTER(cdoublearray,p,[2,3]) a(1)=1 a(2)=2 write(*,*) p(1,1)," ",p(2,1)," ",p(1,2) end program test.c: #include<stdio.h> void C_ASSIGN_ARRAY_TO_FORTRAN(void ** p,double * a) { int i; //printf("%d",a); *p=a; return; } 神威编译脚本test.sh: #!/bin/sh rm -rf ./*.o a.out mpicc -c test.c -o test.o mpif90 -c main.f90 -d8 -r8 -o main.o mpif90 main.o test.o -d8 -r8 x86编译脚本test.sh: #!/bin/sh rm -rf ./*.o a.out mpicc -c test.c -o test.o mpif90 -c main.f90 -fdefault-real-8 -fdefault-double-8 -o main.o mpif90 main.o test.o -fdefault-real-8 -fdefault-double-8
神威输出结果
x86输出结果
-
可能是神威的iso_c_binding有毛病...然后也可能是open64的fortran环境指针结构比较复杂. 把你的c代码贴出来? 以及你怎么调的assign那个函数.
另外推荐直接用cray pointer.
-
@段晓辉 在 Fortran与C语言指针编译问题 中说:
有毛病...然后也可能是open64的fortran环境指针结构比较复杂.
C代码也贴了都在上面,f90,和c都在上面,直接用脚本可以跑一遍,因为是交叉编译,我直接用call函数就可以直接调那个assign函数,cray指针我改不了维度。。很麻烦。。我想用C特性
-
@大笨象 我没看到滚动条, 不好意思... 代码看着毛病不大, 那么我觉得可能是open64的问题.
所以, 推荐用cray_pointer:real(kind=8) :: a(10) real(kind=8) :: b(2, 5) pointer(b_ptr, b) !b_ptr指向的地址是b的内容 !进入函数体 b_ptr = loc(a)
-
@段晓辉 可是如果我的指向的不是a(1) 我要指向 a(5)这样是不是就不行了啊?open64是个什么意思呢?
-
@大笨象 sw5f90用的open64的fortran库, 然后cray指针的话loc(a(5))就行了
-
@段晓辉 不好意思有点不太懂,有没有一个小demo或者编译指令,然后我去试试。。谢谢 有点不太明白open64,和open64是个啥关系啊?意思是直接用mpif90编译即可?