将功能输出分配给变量
Assigning the function output to a variable
我有一个函数,该函数返回名称为'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;
,则a
和b
指向内存中的相同位置。
两个点:1.您的代码说该功能inversekinematic()
返回指针转到double
,而不是数组。2.您将指针返回到double
,但始终是相同的地址。
也许Typedefs可以帮助简化代码?
typedef double Mat42[4][2];
Mat42 a, a1;
Mat42 *inversekinematic(double target[4][4])
{
// ...
return &a;
}
但是,对于您显示的代码,我不明白为什么您需要返回固定全局值的地址。也许您的真实代码可能会返回" A"或" A1"的地址,但是如果不是...
- 是否可以使用其他变量为变量分配值,而无需在 C++ 中更改其值?
- 将字符串变量分配给无符号字符变量
- 将延迟变量分配给引用变量
- 为什么以下变量分配不正确
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- C++ 无法将字符数组变量分配给字符串变量
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 识别矩阵变量分配的行为
- C 为什么在原始双阵列中的分配似乎比双变量分配要快得多
- C++:如何将 char 变量分配给向量<char>并访问该向量的元素进行比较?
- 将局部方法变量分配给类指针
- 类构造函数中的静态成员变量分配
- 如果条件语句中的变量分配
- C++ - 将一个变量分配给另一个变量和将变量分配给引用变量有什么区别?
- 需要帮助了解指针变量分配
- 从值捕获的变量分配到lambda参数时,GCC编译器分割故障
- 将非按引用变量分配给返回按引用的函数,反之亦然
- 通过结构指针访问结构变量分配错误数据
- 分段故障(核心倾倒)变量分配
- 在名称空间之外的C 中的外部变量分配值