入力整数インデックス(0,1,2)を指定して、置換可能なレコード(MyRecord0、MyRecord1、またはMyRecord2のいずれか)を返す関数を定義します。Modelicaの置換可能レコードを返す関数
これは単純なデモンストレーションの例であり、実際にはさらに多くのレコードがあり、それぞれに追加のパラメータが含まれていることに注意してください。私は成功し、以下に示すのGetRecord機能を使用して関数から適切なレコードを返すことができました
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;
が、私は明示のためのオブジェクトを宣言する必要があります。
例レコードの定義は以下の通りです関数内の各レコードタイプ。
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;
任意のヒントや提案は歓迎です!例を想定し
ハンスは、()がレコードのインスタンスを作成することを正しく理解していますか? –
はい、MyRecord0()は自動的に生成されたレコードコンストラクタを呼び出してレコードのインスタンスを作成します。 –