не может преобразовать 'float *' в 'float' в присваивании - PullRequest
0 голосов
/ 15 апреля 2019

ОБНОВЛЕНИЕ 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 голосов
/ 15 апреля 2019

Как было сказано в другом ответе, поскольку 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 будет содержать ваши три координаты. Вы можете легко адаптировать его, чтобы иметь только Yaw, если хотите!

0 голосов
/ 15 апреля 2019

возвращение локального массива (объявленного внутри функции) вызовет у вас проблемы, потому что он выходит из области видимости, как только функция завершается.Чтобы вернуть локальный массив, его нужно динамически распределить, чтобы он мог пережить функцию

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; 
}
...