【问题标题】:How to pass a whole structure in and out of a function using an Arduino / C++如何使用 Arduino / C++ 将整个结构传入和传出函数
【发布时间】:2018-07-25 20:50:32
【问题描述】:

我对 Arduino 编程还很陌生,对如何将结构与函数一起使用有点困惑。

下面是一个例子 - 我有 2 组数据存储在一个结构中,struct1 - firstSet 和 secondSet。我想获取这些集合中的每一个,并将函数应用于它们,更改所有值。然后我想将新值打印到控制台,每次迭代时数字应该会变大,firstSet 的速度是 secondSet 的两倍。

这不会发生,并且会一遍又一遍地打印初始值。我不确定我需要做什么才能将这些值反馈到它们的原始结构中。

我一直在考虑添加一条返回线,并将 void 更改为其他内容(int 和 void*),但我似乎真的无法解决这个问题。甚至可能吗?或者有没有更好的方法来做到这一点?提前致谢!

#include "Arduino.h"
//The setup function is called once at startup of the sketch
struct struct1
{
int val1 = 1;
int val2 = 2;
int val3 = 3;

};

struct1 firstSet;
struct1 secondSet;

void func1(struct struct1)
{
struct1 dataSet;
dataSet.val1 = dataSet.val2;
dataSet.val2 = dataSet.val3;
dataSet.val3++;
}
void setup()
{
  Serial.begin(9600);
  while (! Serial);
  Serial.println("Console Online");
}
void printAll()
{
Serial.println(firstSet.val1);
Serial.println(firstSet.val2);
Serial.println(firstSet.val3);
Serial.println("---");
Serial.println(secondSet.val1);
Serial.println(secondSet.val2);
Serial.println(secondSet.val3);
Serial.println("---END---");
}

// The loop function is called in an endless loop
void loop()
{
func1(firstSet);
func1(firstSet);
func1(secondSet);
printAll();
delay (1000);
}

【问题讨论】:

标签: c++ function data-structures arduino


【解决方案1】:

func1 采用struct struct1,即结构的副本 作为参数。因此,函数中所做的更改在调用代码中不可见。即使这样,您实际上并没有更改参数,而是更改了局部变量。

您需要将参数声明为引用,以将参数链接到调用函数中的变量。然后你会看到变化。

void func1(struct1 &dataSet)
{
    dataSet.val1 = dataSet.val2;
    dataSet.val2 = dataSet.val3;
    dataSet.val3++;
}

【讨论】:

  • 感谢您,效果很好!现在看看我是否可以让它在我的主要项目中工作。我确实发现我必须保留结构定义,例如:'void func1(struct struct1 &dataSet)'
  • 在 Arduino 1.8.15 (nano IoT) 中这不起作用。请参阅下面的答案,了解如何操作。
【解决方案2】:

我对你想要的细节进行了一些猜测,但答案的本质是你的函数必须对结构进行 reference

void func1(struct1& dataSet)
{
    dataSet.val1 = dataSet.val2;
    dataSet.val2 = dataSet.val3;
    dataSet.val3++;
}

& 使 dataSet 成为引用。您的代码传递了结构的副本(以及其他错误),这就是它永远无法改变原始结构的原因。

【讨论】:

    【解决方案3】:

    您需要将函数参数声明为引用,以将其链接到调用函数中的变量。 在 Arduino IDE 中,可以像这样在函数中声明 struct

    (下例是读取Nano的IMU加速度传感器数据)

    #include <Arduino_LSM6DS3.h> // Use Arduino library for the IMU on the Nano 33 IOT
    
    struct AccelerationData{
      // accelerometer values
      float ax;
      float ay;
      float az;
    };
    
    void getAccelerationValues(struct AccelerationData & data){
        data.ax=-1;
        data.ay=-1;
        data.az=-1;
        // read accelerometer values if available
        if (IMU.accelerationAvailable()) {
          IMU.readAcceleration(data.ax,data.ay,data.az);
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2021-08-12
      相关资源
      最近更新 更多