Можно ли вернуть Dymola несколько значений из внешнего файла?

Например, у меня есть внешняя функция C, которая возвращает структуру. Можно ли вернуть структуру в Modelica?

struct point{
   double x;
   double y;
}

struct point return_Struct(double a, double b){
    struct point pt;
    pt.x = a;
    pt.y = b;
    return pt;
};

В Модельке,

function structReturn
  input Real x;
  input Real y;
  output ??????;
external"C" ????? = return_Struct(x,y)
  annotation (Include="#include <cStructReturn.c>");
end structReturn;

person Hang Yu    schedule 07.01.2014    source источник


Ответы (1)


Используйте запись и передайте ее по ссылке. См. раздел 12.9.1.3 Records в спецификации Modelica. Обратите внимание, что имя записи в инструменте Modelica может отличаться от ожидаемого, поэтому передайте его через void* и явно приведите. Используйте библиотеку, а не включенный C-файл, чтобы скрыть интерфейс, иначе код может не скомпилироваться.

void return_Struct(double a, double b, void* result){
    struct point *pt = result;
    pt->x = a;
    pt->y = b;
};
record R
  Real x,y;
end R;

function structReturn
  input Real x;
  input Real y;
  output R r;
external"C" return_Struct(x,y,r)
  annotation (Library="cstructreturn");
end structReturn;

Но я рекомендую передавать 2 вещественных числа в качестве вывода внешней функции и вместо этого создавать запись в функции-оболочке Modelica.

function multipleReturn
  input Real x;
  input Real y;
  output Real ox;
  output Real oy;
external"C" return_notStruct(x,y,ox,oy)
  annotation (Library="cstructreturn");
end multipleReturn;
person sjoelund.se    schedule 08.01.2014
comment
Большое спасибо за ваши ответы, это очень полезно! - person Hang Yu; 08.01.2014