将函数输出分配给变量

时间:2017-04-30 21:32:38

标签: c++ function arduino return output

我有一个函数,它返回名称为'a'的4x2矩阵的地址。 此函数计算内部'a'矩阵的元素并返回矩阵的地址。当我使用该函数时,我想将其输出分配给一个名为'a1'的矩阵,但是当我这样做时,'a1'变成零矩阵。但是,当我将输出分配给相同的'a'矩阵时,一切正常。谁能帮我?代码是在Arduino IDE上编写的。

double a[4][2], a1[4][2];
double T0E[4][4]={
  {0.1632, -0.3420, 0.9254, 297.9772},
  {0.0594, 0.9397, 0.3368, 108.4548},
  {-0.9848, 0, 0.1736, -280.5472},
  {0, 0, 0, 1}
};

const int axis_limits[4][2]=
  {
    { -160, 160 },
    { -135, 60 },
    { -135, 135 },
    { -90, 90 }
  };
  const unsigned int basex = 50, basez = 100, link1 = 200, link2 = 200, link3=30, endeff=link3+50;

double *inversekinematic(double target[4][4])
{

  // angle 1
  a[0][0] = -asin(target[0][1]);
  a[0][1] = a[0][0];
  if (a[0][0]<axis_limits[0][0] || a[0][0]>axis_limits[0][1] || isnan(a[0][0]))
  {
  bool error=true;
  }

  // angle 2
  double A = sqrt(pow(target[0][3]-cos(a[0][0])*endeff*target[2][2], 2) + pow(target[1][3]-sin(a[0][0])*endeff*target[2][2], 2));
  double N = (A - basex) / link1;
  double M = -(target[2][3]-endeff*target[2][0] - basez) / link2;
  double theta = acos(N / sqrt(pow(N, 2) + pow(M, 2)));
  a[1][0] = theta + acos(sqrt(pow(N, 2) + pow(M, 2)) / 2);
  a[1][1] = theta - acos(sqrt(pow(N, 2) + pow(M, 2)) / 2);

  // angle 3
  for (int i = 0; i <= 1; i++) 
  {
  a[2][i] = {asin(-(target[2][3]-endeff*target[2][0]-basez)/link2-sin(a[1][i]))-a[1][i]};
    }

  // angle 4
  for(int i = 0; i <=1; i++)
    {
      a[3][i] = {-asin(target[2][0])-a[1][i]-a[2][i]};
      }
      return &a[4][2];
}

void setup(){
  Serial.begin(9600);
}

void loop() {
  a1[4][2]={*inversekinematic(T0E)};
}

2 个答案:

答案 0 :(得分:0)

当您键入return &a[4][2];时,您将返回第5行第3个元素的地址。这是不受限制的,因为C ++使用从零开始的索引,并且数组被声明为double a[4][2];。我想你想做的只是return a;来返回整个矩阵的地址。

另外,你做了很多奇怪的事情,比如用一个大小声明参数double target[4][4]并使用初始化列表来分配单个元素,这对我来说很不寻常。

我会尝试更加详细一点。在C / C ++中,数组只不过是指针。因此,当您将一个数组分配给另一个数组时,您将使它们在字面上指向内存中的相同数据。您需要做的是使用循环复制元素,或者使用memcpy(dest, src, size)。例如,如果您要将double a[4][2]的内容复制double b[4][2],则可以使用memcpy(b, a, sizeof(double) * 8);之类的内容。如果您使用a = b;,则ab指向内存中的相同位置。

答案 1 :(得分:0)

两点: 1.您的代码表示函数inversekinematic()返回指向double的指针,而不是数组。 2.您返回指向double的指针,但它始终是相同的地址。

也许typedefs有助于简化代码?

typedef double Mat42[4][2];

Mat42 a, a1;

Mat42 *inversekinematic(double target[4][4])
{
        // ...
        return &a;
}

但是,对于您显示的代码,我不明白为什么需要返回固定全局值的地址。也许您的真实代码可能会返回“a”或“a1”的地址,但如果不是......