将功能输出分配给变量

Assigning the function output to a variable

本文关键字:变量 分配 输出 功能      更新时间:2023-10-16

我有一个函数,该函数返回名称为'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)};
}

键入return &a[4][2];时,您将返回第五行的第三元素的地址。这超出了界限,因为C 使用基于零的索引,并且该数组被称为double a[4][2];。我认为您想做的就是return a;返回整个矩阵的地址。

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

我会尝试更详细。在C/C 中,数组无非就是指针。因此,当您将一个数组分配给另一个数组时,您会使它们在内存中指向相同的数据。您要做的就是用循环复制元素,或者使用memcpy(dest, src, size)。例如,如果要 copy double a[4][2]的内容到 double b[4][2],则将使用诸如 memcpy(b, a, sizeof(double) * 8);之类的东西。如果使用a = b;,则ab指向内存中的相同位置。

两个点:1.您的代码说该功能inversekinematic()返回指针转到double,而不是数组。2.您将指针返回到double,但始终是相同的地址。

也许Typedefs可以帮助简化代码?

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

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