无法将浮点数组传递出函数

时间:2019-05-26 03:15:16

标签: c++ arrays floating-point

我是c ++的新手,我想使用指针将float数组传递出函数。但是,返回的数组始终为0;我正在Arduino Uno上运行。

这是我的代码。我希望readSensor()函数传递一个包含3个float的float数组。浮点数组应传递给指针输出*。但是当我打印出读数时,它显示的是0.00,而不是我传递的值。

void setup() {
  Serial.begin(9600);
}

void loop() {
  float readings[3];
  readSensor(readings);
  for (int i = 0;i < 3;i++) {
    Serial.println(readings[i]);
  }
  delay(1000);
}

// pass out these 3 floats
float val1 = 3.14159;
float val2 = 2.741;
float val3 = 87;
void readSensor(float* output) {
  float container[3] = {val1, val2, val3};
  output = container;
}

3 个答案:

答案 0 :(得分:5)

您无法按照自己的方式“将数组从函数中传递出去”。 C ++仅通过使用指针和原始(C样式)数组就没有提供这种机制。

以您的特定方式

void readSensor(float* output) {
 float container[3] = {val1, val2, val3};
 output = container;
}
函数返回时,

container不再存在。另外,output是按值传递的,因此调用者看不到分配output = container

有必要将指向数组(数组的第一个元素)的指针传递给函数,并让函数根据需要向其复制数据。例如,

void readSensor(float* output)
{
     float container[3] = {1, 2, 3};
     for (int i = 0; i < 3; ++i)
        output[i] = container[i];
}

并且调用者必须提供数组并将其传递。

int main()
{
     float result[3];
     readSensor(result);   // data will be copied into result
     // use result here
}

请记住,调用者负责正确调用该函数。例如,如果上面函数的调用者传递了一个包含两个元素的数组,则行为是不确定的。

C ++中的一种首选方法是使用标准容器,例如std::vector。例如;

#include <vector>

std::vector<float> readSensor()
{
     float container[3] = {1, 2, 3};
     std::vector<float> output;
     for (int i = 0; i < 3; ++i)
        output.push_back(container[i]);
     return output;
}

int main()
{
     std::vector<float> result;
     result = readSensor();
     // use result here
}

如果您不知道如何使用标准容器,则周围有很多文档。

答案 1 :(得分:2)

void readSensor(float* output) 
{
    float container[3] = {val1, val2, val3};
    for (int i=0; i<3; i++)
    {
        output[i] = container[i];
    }   
}

如果有帮助,请投票并接受答案

答案 2 :(得分:1)

void readSensor(float* output) {
  float container[3] = {val1, val2, val3};
  output = container;
}

在这里,您正在堆栈上创建一个数组container并将其初始化,并将其第一个元素的地址分配给output。然后,当您到达函数末尾时container销毁,并且在函数返回时,output所指向的数组不再存在。

j.doe的答案是对此的一种解决方案,但是您必须小心确保output在指向 为其分配值之前已经指向足够大的数组。您也可以考虑研究std::arraystd::vector