我应该在C端未定义的子例程旁边放置“ bindC”吗?

问题描述

说,我有一个C ++函数,必须在Fortran库中实现。

我决定将Fortran包装器封装在一个模块中,如下所示。

(C ++方面)

extern "C" void cpp_func1(int* n,int* array) { ... }

(在Fortran方面)

module cpp2fortran
  use ISO_C_BINDING
  implicit none

  interface
! (1)
    subroutine cpp_func1(n,array) bind(C)
      use iso_c_binding
      integer(C_INT),intent(in) :: n
      type(C_PTR),value,intent(in) :: array
    end subroutine
  end interface  

contains

! (2)
    subroutine Utilize_cpp_func1( ... )  ! bind(C)
    use iso_c_binding

    ...

    call cpp_func1(...)

    ...

  end subroutine

end module

我在两个地方标记了数字,例如(1)和(2)。

在(1)的最后,我肯定放了bind(C),没有它,代码将无法编译。

问题是,我应该将bind(C)放在(2)的末尾吗?

该代码的编译/工作与行(2)末尾bind(C)的存在无关,但是我发现如果我将bind(C)放在其中,某些类似于Fortran的优化将不起作用

例如,在没有bind(C)的普通Fortran中,

real,allocatable :: arr1(:)
real,allocatable :: arr2(:)

...

arr2 = arr1

...

可以正常工作。但是,如果我输入bind(C),它将无法正常工作,因此我必须进行如下修改

real,allocatable :: arr2(:)

...

do i = 1,size
  arr2(i) = arr1(i)
enddo

...

如果可以安全地从类似(2)的Fortran包装器中删除bind(C),我很乐意将其删除并使用诸如arr2 = arr1之类的简洁优化方法,而不是花费冗长的代码编写所有do循环


这是bind(C)引起问题的最小示例。我用ifort编译它。

module cbind
  use iso_c_binding
  implicit none
contains
(*) subroutine sub1(array) !bind(C)
    use iso_c_binding
    implicit none
    real,allocatable,intent(in) :: array(:)

    real(C_FLOAT),target :: array_target(:)

    allocate( array_target(size(array,1)) )

    array_target = array

    print *,'array'
    print *,array
    print *,'array_target'
    print *,array_target

  end subroutine
end module

program test
  use iso_c_binding
  use cbind
  implicit none
  real,allocatable :: array(:)

  allocate( array(5) )

  array = 1.0

  call sub1(array)

end program

在行(*)处没有bind(C)的情况下,代码可以在所需的输出上正常工作。

array
  1.000000       1.000000       1.000000       1.000000       1.000000  
array_target
  1.000000       1.000000       1.000000       1.000000       1.000000  

但是,如果我放bind(C),则代码段会显示以下输出。

 array
   1.000000       1.000000       1.000000       1.000000       1.000000    
 array_target
forrtl: severe (174): SIGSEGV,segmentation fault occurred
Image              PC                Routine            Line        Source   
cbinding1          00000000004051B3  Unknown               Unknown  Unknown
libpthread-2.17.s  00002AC983A5E5F0  Unknown               Unknown  Unknown
cbinding1          000000000045382A  Unknown               Unknown  Unknown
cbinding1          000000000042B967  Unknown               Unknown  Unknown
cbinding1          000000000040FCB3  Unknown               Unknown  Unknown
cbinding1          000000000040CA01  Unknown               Unknown  Unknown
cbinding1          0000000000403C1B  Unknown               Unknown  Unknown
cbinding1          00000000004037E2  Unknown               Unknown  Unknown
libc-2.17.so       00002AC983C8D505  __libc_start_main     Unknown  Unknown
cbinding1          00000000004036E9  Unknown               Unknown  Unknown

解决方法

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

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

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