在 Modelica 中可以定义外部函数。
规范第 12.9 章表示支持 C 和 Fortran77,
将来可能会支持 C++ 和 Fortran90。
现在我想知道哪个C 的版本 http://en.wikipedia.org/wiki/C_programming_language#C99是否支持?
特别是我需要 C99 中提供的对数 gamma 函数,所以我尝试了以下方法:
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 外部函数工作?
On the 维基百科 C 数学运算列表 http://en.wikipedia.org/wiki/C_mathematical_operations还有一些更有趣的函数,例如错误函数 erf 和 erfc,如果有这些函数也很好。
您只能假设 C89/90 代码在 Modelica 编译器中编译。这主要与语法有关(如果您使用Include
注释或Library="file.c"
).
可用的函数主要取决于编译器链接的 C 库。我猜微软的C库不包含lgamma
,所以它不能被链接。
在 Linux/OpenModelica 上,lgamma
示例确实有效libm
包含该函数(它使用 c90 模式进行编译,但隐式添加double lgamma(double)
宣言)。
The powf
示例也可以编译,但无法正常工作,因为您的external "C"
声明声明它使用双精度浮点(从 Modelica 3.2 开始您无法更改它)。powf
将读取 a 的一半并将其用作第一个参数,然后读取 a 的后半部分并将其用作第二个参数。 b 将被丢弃。如果将编译器标志设置为std=c99
,检测到错误:
powf.h:23:15:错误:“powf”的类型冲突
请注意,如果您在 Windows 上使用 Dymola,则很可能使用 Visual Studio。在这种情况下,除了从 C++ 复制的部分之外,不存在 C99 支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)