如何从外部 C 代码返回 dymola 中的 double* 结构

问题描述 投票:0回答:1

这个问题类似于这个问题: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。

c struct extern dymola
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.