2011-10-20 14 views
4

Modelicaでは、外部関数を定義することができます。
スペックの第12.9章では、CおよびFortran77がサポートされていると述べています。
C++およびFortran90は将来サポートされる可能性があります。
versions of Cはサポートされていますか? powfの作品ながら、Modelica外部関数:C対C99

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

が、それは動作しません:特に

私はC99で利用可能である対数ガンマ関数を必要とするので、私は次のことを試してみました

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

これはおそらくをLgammaがC99で導入されている間にpowfがCで利用可能になるために起こります。
これはModelica、Dymola、または私のコンパイラの制限ですか?
C99の外部機能を動作させる方法はありますか?
Wikipedia list of C mathematical operationsには、エラー関数erfやerfcのような興味深い関数がいくつかありますが、これも良いことでしょう。

+0

Visual Studio 2013では、機能拡張されたCommunity Editionが導入され、拡張数学ライブラリも導入されています。 Visual Studio 12.0 \ VC \ include \ math.h \ – matth

答えて

4

C89/90コードは、Modelicaコンパイラでコンパイルすると仮定できます。これは主に構文に関するものです(Include注釈を使用する場合、またはLibrary="file.c"を使用する場合)。

使用可能な関数は、主に、コンパイラがリンクするCライブラリに依存します。 MicrosoftのCライブラリにはlgammaが含まれていないので、リンクすることはできません。 Linux/OpenModelica上では、には(c90モードを使用してコンパイルしていますが、暗黙的にdouble lgamma(double)宣言を追加しています)、この例のようにlgammaの例が機能します。

external "C"宣言で倍精度浮動小数点を使用していることを示しています(また、Modelica 3.2ではこれを変更できません)。powfの例もコンパイルされますが、正しく動作しません。 powfはaの半分を読み込み、最初の引数として使用し、aの後半を読み取り、2番目の引数として使用します。 bは廃棄される。あなたはstd=c99にコンパイラフラグを設定した場合、エラーが検出された:

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

注意Windows上でDymolaはを使用している場合、あなたが最も可能性が高いのVisual Studioを使用していること。その場合、C++からコピーされた部分を除いてC99サポートはありません。

+0

この包括的な答えをありがとうございました! – matth

+0

PS:もっと書きたいと思っていましたが、stackexchangeでは5分間の編集しかできないので、私の答えの2番目の部分です:包括的な答えをありがとう!私はVisual Studio 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

関連する問題