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
    
    

    神威输出结果
    0_1546098064235_b9f48ad1-1df1-4b07-a1f0-ca509f93aeb0-image.png

    x86输出结果
    0_1546098041960_766840d2-d773-4dbd-a8df-e5c626d0965a-image.png



  • 可能是神威的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编译即可?


登录后回复