Я изучаю C совместимость FORtran в течение нескольких дней, чтобы вызвать Fortran функцию DLL из C. Здесь я нашел эту ссылку: Use Fortran-code in CОб использовании Fortran функции в C с iso_c_binding
Я пытаюсь создать Fortran DLL, как это и мой компилятор Intel Fortran компилятор:
module integration
implicit none
contains
function Integrate(func, a,b, intsteps) result(integral)
!DEC$ ATTRIBUTES DLLEXPORT :: Integrate
interface
real function func(x)
real, intent(in) :: x
end function func
end interface
real :: integral, a, b
integer :: intsteps
intent(in) :: a, b, intsteps
optional :: intsteps
real :: x, dx
integer :: i,n
integer, parameter :: rk = kind(x)
n = 1000
if (present(intsteps)) n = intsteps
dx = (b-a)/n
integral = 0.0_rk
do i = 1,n
x = a + (1.0_rk * i - 0.5_rk) * dx
integral = integral + func(x)
end do
integral = integral * dx
end function
end module integration
real(c_float) function wrapper_integrate(func, a, b, intsteps) result(integral) bind(C, name='integrate')
use iso_c_binding
use integration
interface
function iFunc(x) bind(C)
use, intrinsic :: iso_c_binding
real(c_float) :: iFunc
real(c_float), intent(in) :: x
end function iFunc
end interface
type(C_FUNPTR), INTENT(IN), VALUE :: func
real(c_float) :: a,b
integer(c_int),intent(in) :: intsteps
optional :: intsteps
procedure(iFunc),pointer :: myfunc
call c_f_procpointer(func, myfunc)
if (present(intsteps)) then
integral = Integrate(myfunc,a,b,intsteps) <==error #8128
else
integral = Integrate(myfunc,a,b) <==error #8128
endif
end function wrapper_integrate
Когда я построил DLL, ошибка показывает ниже
error #8128: The BIND attribute of the associated actual procedure differs from the BIND attribute of the dummy procedure. [MYFUNC]
Строка ошибки, обозначенная в коде, выглядит как myfunc
не равна func
, определенной в интеграции модулей. Возможно, я могу использовать iso_c_binding
для модификации модуля integration
.
Иногда некоторые функции Fortrans имеют множество аргументов, которые должны быть назначены и использованы в функции, это не простой способ использовать iso_c_binding
в Fortran. Итак, как решить ошибку в MYFUNC
?
Фиктивная процедура в 'Integrate' имеет атрибут' bind'; указатель функции 'myfunc', который является фактическим аргументом, имеет интерфейс, заданный' iFunc', который не имеет интерфейса 'bind'. – francescalus
Да! Я забыл об этом! Теперь я могу экспортировать Fortran Dll. – radiosan
И спасибо за редактирование моего вопроса, который делает его аккуратным! – radiosan