Ошибка цикла через массив modelica

Я использую openmodelica и пытаюсь пройтись по массиву, чтобы найти максимальное значение. Я смог сократить свой код до очень простого тестового примера, который все еще дает ошибку. Это что-то, что я делаю неправильно, или это ошибка в openmodelica? Вот очень простой случай, который дает ошибку:

package TestLoop
  model ItemA
    Real p;
  end ItemA;

  model ItemB
    ItemA a[n];
    parameter Integer n = 5;
    Real p;
  equation
    for i in 1:n loop
      a[i].p = time;
    end for;
  algorithm
    for i in 1:n loop
      p := a[i].p;
    end for;
  end ItemB;
end TestLoop;

Проблема в моем разделе алгоритма. Вот ошибка, которую я получаю:

TestLoop.ItemB.c:155:13: warning: implicit declaration of function '$Pa$lB' is invalid in C99 [-Wimplicit-function-declaration]
      $Pp = $Pa$lB(modelica_integer)$Pi$rB$Pp;
            ^
TestLoop.ItemB.c:155:20: error: unexpected type name 'modelica_integer': expected expression
      $Pp = $Pa$lB(modelica_integer)$Pi$rB$Pp;
                   ^
1 warning and 1 error generated.

Любые предложения о том, почему это может быть, или как я могу обойти это? Если я заменю присваивание фиксированным значением p:=a[1].p;, код запустится (хотя мне это бесполезно). Что я в конечном итоге хочу сделать в разделе алгоритмов, так это найти наибольшее значение a[n].p, где у меня есть раздел уравнений, который выполняет полезные вычисления в массиве элементов.


person Adam    schedule 13.01.2015    source источник


Ответы (1)


Да, генерация кода — это ошибка OpenModelica (она не любит неизвестные индексы массива). Однако вашу проблему очень легко решить в одну строку (одну из следующих):

p = max(r for r in a.p);
p = max(a.p);
person sjoelund.se    schedule 14.01.2015
comment
Также описано в Разделе 10.3.4 Функции редукции и операторы спецификации Modelica: modelica .org/documents/ModelicaSpec33.pdf#page=113 - person matth; 14.01.2015
comment
Я также искал, чтобы найти индекс макс. Ваше предложение указало мне правильное направление и для этого. model ItemC ItemA a[n]; parameter Integer n = 5; Real p; Integer n2; Real p2[n]; equation for i in 1:n loop a[i].p = time / i; end for; algorithm p2 := vector(a.p); n2 := 0; p := 0; for i in 1:n loop if p2[i] > p then n2 := i; p := p2[i]; end if; end for; end ItemC; - person Adam; 14.01.2015