2017-05-18 4 views
3

入力整数インデックス(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; 

任意のヒントや提案は歓迎です!例を想定し

答えて

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はでテスト。)

異なるレコードの一部は、追加のフィールドが含まれている場合はそこには良い解決策ではありません。

+0

ハンスは、()がレコードのインスタンスを作成することを正しく理解していますか? –

+0

はい、MyRecord0()は自動的に生成されたレコードコンストラクタを呼び出してレコードのインスタンスを作成します。 –

関連する問題