在Modelica中返回可替换记录的功能

时间:2017-05-18 03:36:34

标签: modelica dymola openmodelica

我想定义一个函数,该函数在给定输入整数索引(0,1或2)的情况下返回可替换记录(MyRecord0,MyRecord1或MyRecord2)。

请注意,这只是一个简单的演示示例案例,实际上可能还有更多记录,每个记录都包含其他参数。

示例记录的定义如下所示:

  record MyRecord0
    parameter Integer myIndex = 0;
    parameter Real myValue = 0;
  end MyRecord0;

  record MyRecord1
    extends MyRecord0(
      myIndex = 1,
      myValue = 1);
  end MyRecord1;

  record MyRecord2
    extends MyRecord0(
      myIndex = 2,
      myValue = 2);
  end MyRecord2;

我已经能够使用下面显示的getRecord函数从函数中成功返回相应的记录,但是我需要为函数中的每个记录类型显式声明一个对象。

function getRecord
  input Integer index "record index";
  replaceable output MyRecord0 myRecord;

  // Explicit declaration of instances for each possible record type
  MyRecord0 record0;
  MyRecord1 record1;
  MyRecord2 record2;

algorithm 
  if index == 1 then
    myRecord := record1;
  else
    if index == 2 then
      myRecord := record2;
    else
      myRecord := record0;
    end if;
  end if;   
end getRecord;

任何人都可以建议一种替代语法,无需在函数中声明每种可能记录类型的实例吗?例如,我尝试过如下所示的变体,但找不到合适编译的令人满意的方法。

function getRecord_Generic
  input Integer index "record index";
  replaceable output MyRecord0 myRecord;

  redeclare MyRecord1 myRecord if index == 1; else (redeclare MyRecord2 myRecord if index == 2 else redeclare MyRecord0 myRecord);
end getRecord_Generic;

或者

function getRecord_Generic2
  input Integer index "record index";
  replaceable output MyRecord0 myRecord;

algorithm 
  if index == 1 then
    redeclare MyRecord1 myRecord;
  else
    if index ==2 then
      redeclare MyRecord2 myRecord;
    else
      // default case
      redecalre MyRecord0 myRecord;
    end if;
  end if;      
end getRecord_Generic2;

任何提示或建议都表示赞赏!

1 个答案:

答案 0 :(得分:2)

假设这个例子很简单:

  function getRecord2
  input Integer index "record index";
  output MyRecord0 myRecord;

  algorithm 
    if index==1 then
      myRecord := MyRecord1();
  else
    if index == 2 then
      myRecord := MyRecord2();
    else
      myRecord := MyRecord0();
    end if;
  end if;   
end getRecord2;

(仅用Dymola测试过。)

如果某些不同的记录包含其他字段,则没有好的解决方案。