2016-12-28 198 views
1

我試圖在Fortran中編寫一些數字功能,以便以後可以在Excel中訪問這些功能。我使用的是Office 2013(64位),Visual Studio 2015「Community」和Intel Fortran(Intel Parallel Studio XE 2017);我能夠正確編譯可執行程序。我也能夠生成DLL文件,我認爲這是正確的。在Fortran中編寫DLL /從Excel調用

這裏有一個最小的Fortran代碼示例我從this tip摸索出:

function id(x) 
    !DEC$ ATTRIBUTES DLLEXPORT :: id 
    integer :: id, x 
    id = x 
    return 
end function 

,我有這對VBA代碼下的Excel側的工作表Sheet1:

Option Explicit 
Option Base 1 
Public Declare PtrSafe _ 
    Function id Lib "mydll.dll" _ 
    (ByVal x As Integer) As Integer 

通過這樣做,我設法使用Excel中的公式欄來自動完成函數名稱,但評估任何實例會導致單元格短暫閃爍0,然後變爲#VALUE !.

我試過很多東西在組合/貨物崇拜時尚:使用ByRef而不是ByVal,有函數只使用整數或單精度(實數* 4)或雙精度(實數* 8)浮點數和那麼事情就更沒有意義了。

我終於用完了隨機鍵組合來進行混搭,並且有很少的來源覆蓋了這個確切的用例。如果非要我熬下來的東西比更精確的「下一步做什麼」:

  • 我會遇到因爲涉及到Fortran和Excel的世界之間的「阻抗不匹配」數字類型什麼的問題?
  • 我是否錯過了必要的樣板,膠水代碼等?

回答

1

看來您並不知道英特爾Fortran提供了幾個Excel/VBA和Fortran接口的工作示例。從https://software.intel.com/en-us/product-code-samples下載Intel Parallel Studio XE for Windows Sample Bundle。在ZIP文件中,compiler_f \ MixedLanguage \ Excel可能與您最相關。一個重要的方面是,來自VBA的任何調用都需要在被調用的例程方面指定STDCALL調用機制,否則你會得到堆棧損壞。

0

以下是英特爾Visual Fortran幫助文件的片段。

subroutine FortranCall (r1, num) 
    !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE, ALIAS:"FortranCall" :: FortranCall 
    integer, intent(in) :: r1 
    character(10), intent(out) :: num 
    !DEC$ ATTRIBUTES REFERENCE :: num 

    num = '' 
    write (num,'(i0)') r1 * 2 

return 
end subroutine FortranCall 

而且他們使用的Excel的一面:

Declare Sub FortranCall Lib "C:\Temp\Fcall.dll" (r1 As Long, ByVal num As String) 

這將是很好的獲得與不同的輸入和輸出更多的例子來幫助用戶。