更新16.4。 11:02
汤姆,你好!我尝试过对您提供的代码进行更改,并输出有趣的值。
我做了一些实验,以更改for循环的大小以及在i
中乘以txString[]
的数字,这就是我观察到的:
**CONDITIONS:**
char tamp[20];
char txString[32];
for (unsigned int i=0; i<3; i++){
char tamp[20];
dtostrf(coordArray[i], 7, 2, tamp); //convert one of your coordinates
for (unsigned int j=0;j<5;j++) {txString[5*i+j] = tamp[j];} //concatenate it inside txString
}
**OUTPUT:**
10:32:06.052 -> Yaw:
10:32:06.052 -> 311.44
10:32:06.052 -> , Pitch:
10:32:06.052 -> -0.03
10:32:06.052 -> , Roll:
10:32:06.052 -> 179.99
10:32:06.052 -> *****txString****
10:32:06.052 -> 311. -0. 179.
10:32:06.052 -> ************
----------------------------
dtostrf(coordArray[i], 7, 2, tamp);
for (unsigned int j=0;j<6;j++) {txString[6*i+j] = tamp[j];
OUTPUT:
10:43:55.371 -> Yaw:
10:43:55.371 -> 310.51
10:43:55.371 -> , Pitch:
10:43:55.371 -> 0.38
10:43:55.371 -> , Roll:
10:43:55.371 -> -179.64
10:43:55.371 -> *****txString****
10:43:55.371 -> 310.5 0.3-179.6ART HELMET //Here it outputs name of the BLE device I gave it in upper part of code I didnt mention here BLEDevice::init("SMART HELMET");
10:43:55.371 -> ************
-----------------------------
dtostrf(coordArray[i], 6, 2, tamp); //here I changed the string width and it outputted only Yaw data
for (unsigned int j=0;j<7;j++) {txString[7*i+j] = tamp[j];
OUTPUT:
10:49:58.993 -> Yaw:
10:49:59.027 -> 311.95
10:49:59.027 -> , Pitch:
10:49:59.027 -> 1.91
10:49:59.027 -> , Roll:
10:49:59.027 -> -178.10
10:49:59.027 -> *****txString****
10:49:59.027 -> 311.95
10:49:59.027 -> ************
--------------------------------
dtostrf(coordArray[i], 16, 2, tamp);
10:58:43.547 -> Yaw:
10:58:43.547 -> 314.31
10:58:43.547 -> , Pitch:
10:58:43.547 -> -0.08
10:58:43.547 -> , Roll:
10:58:43.547 -> 179.93
10:58:43.547 -> *****txString****
10:58:43.547 -> HELMET
10:58:43.547 -> ************
答案 0 :(得分:0)
返回一个局部数组(在函数内部声明)会给您带来麻烦,因为一旦函数结束,它就会超出范围。要返回本地数组,必须对其进行动态分配,以使其能够超过该功能
float* result (float x, float y, float z)
{
float* coordArray=malloc(3*sizeof(float));
coordArray[0] = x;
coordArray[1] = y;
coordArray[2] = z;
return coordArray;
}
答案 1 :(得分:0)
正如在另一个答案中所说的那样,由于coordArray
已在您的函数中分配,因此只要您的程序退出此函数,它将超出范围,因此指针所指向的值将不再正确
如果您需要多次调用此函数,并且要避免malloc
发生内存泄漏,可以将float coordArray[3]
声明为全局变量,然后在函数result
中对其进行更新成为void
函数。
类似
//global declaration
float coordArray[3]
/*
Setup and other code
*/
void result (float x, float y, float z)
{
coordArray[0] = x;
coordArray[1] = y;
coordArray[2] = z;
}
这样,您将避免错误。
注意:全局变量通常在C / C ++中被认为是不干净的,但是,对于内存需求较低且内存泄漏将很快造成严重后果的嵌入式系统,通常建议不要这么做使用动态分配。
希望有帮助!
**编辑**
由于您的结果是void
,因此您不应将其返回值分配给某些东西,它什么也不返回。只需拨打result(yaw, pitch, roll);
即可更新coordArray
。
要将此数组转换为字符串,您应该按顺序进行操作,因为dtostrf
需要一个double
,并且其中有几个:
for (unsigned int i=0; i<3;i++){
char tamp[4];
dtostrf(coordArray[i], 1, 3, tamp); //convert one of your coordinates
for (unsigned int j=0;j<3;j++) txStringYaw[4*i+j] = tamp[j]; //concatenate it inside txStringYaw
}
尽管我没有进行测试,但是可能存在一个小的语法错误。
注意:我不知道我是否很好地理解了您的问题,但是在我的代码txStringYaw
中将包含您的三个坐标。您可以轻松地对其进行调整,以仅拥有偏航角!