2014-01-07 2 views
2

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

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; 
}; 

В Modelica,

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

ответ

3

Используйте запись и передать его по ссылке. См. Раздел 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;
+0

Большое спасибо за ваши ответы, это очень полезно! –