2017-05-18 1 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()은 자동으로 생성 된 레코드 생성자를 호출하여 레코드의 인스턴스를 만듭니다. –

관련 문제