我们都知道回调函数的调用约定非常重要!
C++调用Fortran时的回调函数有两种调用约定,举例说明:
一、__stdcall的方式:
function Power(a,b,ProgressFunc) BIND(c,name='Power')
use omp_lib
use,intrinsic :: ISO_C_BINDING
implicit none
!DEC$ IF DEFINED (_DLL)
!DEC$ ATTRIBUTES DLLEXPORT :: Power
!DEC$ END IF
integer :: Power
!!---------回调函数声明---------!!
interface
function ProgressFunc(num)
!DEC$ ATTRIBUTES STDCALL::ProgressFunc
!DEC$ ATTRIBUTES REFERENCE::num
implicit none
integer(4) :: num !以指针的方式传递
logical :: ProgressFunc
end function
end interface
integer(c_int),value,intent(in) :: a
integer(c_int),value,intent(in) :: b
integer :: i,sum
sum=1
do i=1:b
sum=sum*a
if(ProgressFunc(a)) then
Power=sum !表示用户终止了算法
return
end if
end do
return
end function
相应C++的调用方式如下:
bool __stdcall PrintProgressStdcall(int *i) { printf("progress=%d\n",*i); return false; } int main(int argc, char* argv[]) { int rt=Power(2,20000,PrintProgressStdcall); return 0; }
function Power(a,b,ProgressFunc) BIND(c,name='Power') use omp_lib use,intrinsic :: ISO_C_BINDING implicit none !DEC$ IF DEFINED (_DLL) !DEC$ ATTRIBUTES DLLEXPORT :: Power !DEC$ END IF integer :: Power !!---------回调函数声明---------!! interface function ProgressFunc(num) BIND(c) use,intrinsic :: ISO_C_BINDING implicit none integer(c_int) :: num !以指针的方式传递 logical :: ProgressFunc end function end interface integer(c_int),value,intent(in) :: a integer(c_int),value,intent(in) :: b integer :: i,sum sum=1 do i=1:b sum=sum*a if(ProgressFunc(a)) then Power=sum !表示用户终止了算法 return end if end do return end function
相应C++的调用方式如下:
bool __cdecl PrintProgressStdcall(int *i) //不写的话默认是__cdecl调用约定 { printf("progress=%d\n",*i); return false; } int main(int argc, char* argv[]) { int rt=Power(2,20000,PrintProgressStdcall); return 0; }