“维度大小不相等,目标数组不灵活”

问题描述

当我从我的“主模型”调用这个函数时,它产生了预期的结果,但是当我从另一个函数调用它时,保存、“测试”和编译工作正常,但在“模拟”时我收到以下错误消息:“维度大小不相等,目标数组不灵活”

函数反转/“翻转”长度为 n 的向量,以便最后一个元素先出现。

function myReverse
  input Integer n; 
  input Real[n] v; //  "Real vector";
  output Real[n] result; // "Elements of vector v in reversed order";

algorithm

  result := vector({v[end - i + 1] for i in 1:n});

end myReverse;

解决方法

这很奇怪。我假设您没有使用 Dymola,因为您提供的代码适用于 Dymola 2021x。

我使用了以下测试,模拟模型“Test”:

package ReversePackage
  function myReverse
    input Real[n] v;       //  "Real vector";
    output Real[n] result; // "Elements of vector v in reversed order";

  protected 
    Integer n=size(v,1);

  algorithm 
    result := vector({v[end - i + 1] for i in 1:n});

  end myReverse;

  model Test
    extends Modelica.Icons.Example;
    Real out[2];

  equation 
    out =ReversePackage.myReverse({time,1});
  end Test;
end ReversePackage;

额外说明:我通过读取输入向量的大小来简化 myReverse,而不是将大小作为传递给函数的参数。

只是一个“疯狂的猜测”,但我可以想象,end 运算符会导致问题,请尝试将其替换为 n,这应该不是问题,因为您已经有了它。正如马可指出的那样,不必要的 vector() 也可能导致问题。所以也尝试删除它。下面实施了两项更改:

function myReverse
  input Real[n] v;       //  "Real vector";
  output Real[n] result; // "Elements of vector v in reversed order";
 
protected 
  Integer n=size(v,1);

algorithm 
  result := {v[n- i + 1] for i in 1:n};

end myReverse;