在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,这些也很好。
答案 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支持。