这个问题类似于这个问题:Is it possible to return multiple values from an external file to Dymola? 但不知何故,它帮不了我。
我有以下C结构:
typedef struct ModelicaExport
{
double* foo;
double* bar;
} ModelicaExport;
以及 C 中的以下测试函数
void testExport(double a, double b, void * modelicaExport)
{
ModelicaExport* output = modelicaExport;
double* foo = output->foo;
double* bar = output->bar;
foo[0] = a;
foo[1] = b;
bar[0] = a - b;
bar[1] = a + b;
}
结构和函数在 C 中表现正常,这里没有问题。我可以使用 Visual Studio Build Tools 2019 将函数导出为静态库。这里也没有问题。
当我调用这个函数是Dymola时,问题就出现了。 我在 Dymola 中重新创建了“结构”作为记录(如此处所示https://mbe.modelica.university/behavior/functions/external/)
record recordTest
Real foo[3];
Real bar[3];
end recordTest;
然后我创建函数 dymola 来调用我的外部 C 函数:
function testExportC "test calculation through external C code"
extends Modelica.Icons.Function;
input Real a;
input Real b;
output recordTest cc;
external "C" testExport(a, b, cc)
annotation(Include="#include \"myheader.h\"",Library="mylib");
end testExportC;
我相信标头和库的注释是正确的,因为我在更简单的函数上尝试过它并且一切正常。但是 testExportC 不起作用。它编译得很好,我从 dymola 收到一条消息,说编译成功,但根据 Dymola 的说法,它“没有错误指示就停止了”。我可能会错过什么? 我也在使用 Dymola 2023x 和 Visual Studio Build Tools 2019。
Modelica 中的外部 C 接口用于返回“值”,并且只能处理记录中的标量 - 特别是不支持 modelicaExport 中的数组,https://specification.modelica.org/master/functions.html#记录
这是最近的更改,您使用的旧链接尚未更新。
禁止数组的原因是在实践中数组通常是可变长度的,这会造成混乱。特别是在 C 中,以下结构:
typedef struct ModelicaExport
{
double* foo;
double* bar;
} ModelicaExport;
struct ModelicaExport2 {
double foo[3];
double bar[3];
}
完全不同,不兼容。
你要么重新考虑原来的问题(可能是 X-Y 问题),要么为 testExport 写一个 C-wrapper。