我正在尝试用 Fortran 编写一些数字功能,稍后可以在 Excel 中访问这些功能。我正在使用 Office 2013(64 位)、Visual Studio 2015“社区”和 Intel Fortran(Intel Parallel Studio XE 2017);我能够正确编译可执行程序。我还能够生成 DLL 文件,我认为这是正确的。
这是我从 this tip 中得出的一个最小的 Fortran 代码示例:
function id(x)
!DEC$ ATTRIBUTES DLLEXPORT :: id
integer :: id, x
id = x
return
end function
我在 Excel 端的 Sheet1 的 VBA 代码下有这个:
Option Explicit
Option Base 1
Public Declare PtrSafe _
Function id Lib "mydll.dll" _
(ByVal x As Integer) As Integer
通过这样做,我设法让 Excel 中的公式栏自动完成函数名称,但计算任何实例都会导致单元格短暂闪烁 0,然后变为 #VALUE!。
我已经以组合/ cargo 狂热的方式尝试了很多东西:使用 ByRef
而不是 ByVal
,让函数仅使用整数或单精度(实数* 4) 或 double (real*8) float ,然后是更没有意义的东西。
我终于用完了可以混搭的随机组合键,而且几乎没有资料来源涵盖了这个确切的用例。如果我必须将其归结为比“下一步做什么”更精确的事情:
- 我遇到的问题是由于数字类型还是与 Fortran 和 Excel 世界之间的“阻抗不匹配”相关的问题吗?
- 我是否缺少必要的样板、粘合代码等?
最佳答案
您似乎不知道 Intel Fortran 提供了几个连接 Excel/VBA 和 Fortran 的工作示例。从 https://software.intel.com/en-us/product-code-samples 下载适用于 Windows 的英特尔 Parallel Studio XE 示例包。在 ZIP 文件中,compiler_f\MixedLanguage\Excel 可能是与您最相关的一个。一个重要的方面是,来自 VBA 的任何调用都需要在被调用例程端指定 STDCALL 调用机制,否则会出现堆栈损坏。
关于visual-studio - 用 Fortran 编写 DLL/从 Excel 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353921/