Modelica外部功能:C与C99

时间:2011-10-20 13:37:31

标签: modelica

在Modelica中,可以定义外部函数。
规范的第12.9章说支持C和Fortran77,
将来可能会支持C ++和Fortran90。
现在我想知道支持哪个versions of 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;

这可能是因为在C99中引入了lgamma,而在C中可以使用powf。
但这是Modelica,Dymola还是我编译器的限制?
有没有办法让C99外部功能工作?
Wikipedia list of C mathematical operations上有一些更有趣的函数,如错误函数erf和erfc,这些也很好。

1 个答案:

答案 0 :(得分:4)

您只能假设C89 / 90代码在Modelica编译器中编译。这主要涉及语法(如果您使用Include注释或Library="file.c")。

可用的函数主要取决于编译器链接的C库。我猜Microsoft的C库不包含lgamma,因此无法链接。 在Linux / OpenModelica上,lgamma示例确实有效,因为libm包含函数(它使用c90模式编译,但隐式添加double lgamma(double)声明)。

powf示例也会编译,但由于您的external "C"声明声明它使用双精度浮点(并且您无法在Modelica 3.2中更改此设置),因此无法正常工作。 powf将读取一半并将其用作第一个参数,然后读取a的后半部分并将其用作第二个参数。 b将被丢弃。如果将编译器标志设置为std=c99,则会检测到错误:

  

powf.h:23:15:错误:'powf'的冲突类型

请注意,如果您在Windows上使用Dymola,则最有可能使用Visual Studio。在这种情况下,除了从C ++复制的部分之外,没有C99支持。