4

Modelicaでは、外部関数を定義することができます。
仕様の第12.9章では、CとFortran77が
サポートされており、将来的にはC++とFortran90がサポートされる可能性があると述べています。
今、どのバージョンのCがサポートされているのだろうか?

特に、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外部関数を機能させる方法はありますか?ウィキペディアのC数学演算のリストには、
誤差関数erfやerfcなどのより興味深い関数がいくつかあります。これらもあると便利です。

4

1 に答える 1

4

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

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

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

powf.h:23:15:エラー:「powf」のタイプが競合しています</ p>

WindowsでDymolaを使用している場合は、ほとんどの場合VisualStudioを使用していることに注意してください。その場合、C++からコピーされた部分を除いてC99のサポートはありません。

于 2011-10-21T07:10:46.680 に答える