无法将赋值中的“ float *”转换为“ float”

时间:2019-04-14 22:45:52

标签: c arrays pointers arduino bluetooth-lowenergy

更新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 -> ************

2 个答案:

答案 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中将包含您的三个坐标。您可以轻松地对其进行调整,以仅拥有偏航角!