我们都知道回调函数的调用约定非常重要!
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;
}
二、__cdecl的方式:
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;
}
主要还是在Fortran中声明,相应的调用约定