2015-01-13 128 views
1

我正在使用openmodelica,我试图通过数组循环,以便找到最大值。我能够将我的代码减少到一个非常简单的测试用例,但仍然会导致错误。这是我做错了什么,或者这是openmodelica中的错误?这是一个非常简单的情况,确实会给出错误:通过modelica阵列循环失败

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;代码确实运行(尽管这对我没有用处)。我最终想要在算法部分中做的是找到[n] .p的最大值,其中我有一个公式部分,可以对项目数组进行有用的计算。

回答

2

是的,代码生成是OpenModelica的错误(它不喜欢未知的数组索引)。尽管(单行)解决您的问题非常容易(下列之一):

p = max(r for r in a.p); 
p = max(a.p); 
+0

在第10.3.4节中还描述了Modelica规范的缩减函数和运算符:https://www.modelica。 org/documents/ModelicaSpec33.pdf#page = 113 – matth

+0

我也在寻找max的索引。你的建议也为我指出了正确的方向。 '型号ItemC ItemA a [n]; 参数整数n = 5; Real p; 整数n2; Real p2 [n]; 等式 for i in 1:n loop a [i] .p = time/i; 结束为; 算法 p2:= vector(a.p); n2:= 0; p:= 0; for i in 1:n loop if if [i]> p then n2:= i; p:= p2 [i]; end if; 结束为; end ItemC;' – Adam