我在 DLL 中有两个子例程。要在 C# 中调用它们,它们将更改为 STDCALL,如下所示:
SUBROUTINE MoveToZero(X, N)
!DEC$ ATTRIBUTES DLLEXPORT::MoveToZero
!DEC$ ATTRIBUTES STDCALL,ALIAS:'RemoveBias'::MoveToZero
USE MKL_DFTI
INTEGER :: N
DOUBLE PRECISION :: X(N)
DOUBLE COMPLEX :: Y(N / 2 + 1)
type(DFTI_DESCRIPTOR), POINTER :: des
status = DftiCreateDescriptor(des, DFTI_DOUBLE, DFTI_REAL, 1, N)
status = DftiSetValue(des, DFTI_PLACEMENT, DFTI_NOT_INPLACE)
status = DftiCommitDescriptor(des)
status = DftiComputeForward(des, X, Y)
Y(1) = 0
status = DftiComputeBackward(des, Y, X)
status = DftiFreeDescriptor(des)
X = X / N
END
SUBROUTINE GetApparent(current, voltage, N, output)
!DEC$ ATTRIBUTES DLLEXPORT::GetApparent
!DEC$ ATTRIBUTES STDCALL,ALIAS:'GetApparent'::GetApparent
INTEGER :: N
INTEGER ,PARAMETER :: M = 5
DOUBLE PRECISION :: current(N), voltage(N)
DOUBLE PRECISION :: output(M)
CALL MoveToZero(current, size(current)) ! This line raise an error
End
像这样,我也需要调用MoveToZero
,GetApparent
但是出现错误:
1>D:\Integrate\ProcessModule\Source1.f90(29): error #7519:
Required explicit interface for a procedure with C or STDCALL
attribute is missing from original source. [MOVETOZERO]
那么,如何在 Fortran 中调用 stdcall 子程序呢?