2011-10-20 38 views
4

在Modelica中,可以定義外部函數。
該規範的第12.9章規定C和Fortran77支持,
將來可能會支持C++和Fortran90。
現在我想知道哪個versions of C被支持?Modelica外部函數:C與C99

我特別需要對數伽瑪功能,這是在C99可用,所以我嘗試了以下內容:

function lgamma "logarithmic gamma function" 
    input Real u; 
    output Real y; 
external "C" y = lgamma(u); 
end lgamma; 

,但它不能正常工作,而函數powf作品:

function powf "power function a^b" 
    input Real a; 
    input Real b; 
    output Real y; 
external "C" y = powf(a,b); 
end powf; 

這可能發生是因爲powf在C中可用,而lgamma在C99中引入。
但這是Modelica,Dymola還是我編譯器的限制?
有沒有辦法讓C99外部函數正常工作?
Wikipedia list of C mathematical operations有一些更有趣的功能,如誤差函數erf和erfc,這些也很好。

+0

使用Visual Studio 2013 Microsoft引入了一個擴展了功能的Community Edition,同時也帶來了一個擴展的Math庫!所有提到的功能現在都可以使用,還有更多功能可用,請參閱'C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ math.h' – matth

回答

4

您只能假定在Modelica編譯器中編譯C89/90代碼。這主要是關於語法,雖然(如果您使用Include註釋或Library="file.c")。

可用的函數主要依賴於編譯器鏈接的C庫。我想微軟的C庫不包含lgamma,所以它不能鏈接。 在Linux/OpenModelica上,lgamma示例確實工作,因爲libm包含函數(它使用c90模式編譯,但隱含地添加了double lgamma(double)聲明)。

powf示例也編譯,但不能正常工作,因爲您的external "C"聲明指出它使用雙精度浮點(並且不能像Modelica 3.2那樣更改此屬性)。 powf將讀取a的一半並將其用作其第一個參數,然後讀取a的後半部分並將其用作其第二個參數。 b會被丟棄。如果設置了編譯器標誌,以std=c99,檢測到錯誤:

powf.h:23:15: error: conflicting types for ‘powf’

需要注意的是,如果你在Windows上使用Dymola的,你是最有可能使用Visual Studio。在那種情況下,除了從C++複製的部分之外,沒有C99支持。

+0

謝謝您的全面回答! – matth

+0

PS:我想寫更多,但stackexchange只允許編輯5分鐘,所以這是我的答案的第二部分:謝謝你的全面答案!我確實在Visual C++ 2010 Express中使用了Dymola,並且在'C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ math.h'中沒有定義lgamma。我發送了一封電子郵件給Dymola支持,詢問如何使用'MinGW'代替,我想嘗試一下,看看會發生什麼...... – matth

+0

看起來C++ 11會將lgamma,tgamma,erf和erfc帶到C++中也許下一個MS Visual Studio將支持這些。 – matth