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 数学运算的 Wikipedia 列表中,有一些更有趣的函数,例如误差函数 erf 和 erfc,如果有这些也不错。

4

1 回答 1

4

您只能假设 C89/90 代码在 Modelica 编译器中编译。不过,这主要与语法有关(如果您使用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: 错误:'powf' 的类型冲突</p>

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

于 2011-10-21T07:10:46.680 回答