arduino中动态对象数组中的数据错误

时间:2014-04-19 15:55:02

标签: arrays arduino

目前我正在为我的项目使用Arduino,我想要的是拥有一个存储传感器阵列的数组。我确实理解用于动态数组的资源有限。但是通过限制数组中的项目数并使用struct数据而不是创建类,我设法降低了SRAM的成本。所以不用多说了,这是我的代码:

#define MAX_SENSOR 6

namespace Sensors
{
    typedef struct
    {
        byte SlavePin;
        byte LDRPin;
        byte RedPin;
        byte BluePin;
    } Sensor;

    Sensor _sensors[MAX_SENSOR];
    byte _len = 0;

    void Add(Sensor s)
    {
        if (_len > MAX_SENSOR)
            return;
        _len++;
        _sensors[_len] = s;
    }

    Sensor Get(byte index)
    {
        return _sensors[index];
    }
}

以下是我如何使用它。

#include "Sensors.h"

void setup()
{
    for (int i = 0; i < 6; i++)
    {
        Sensors::Sensor sen;
        sen.SlavePin = 0;
        Sensors::Add(sen);
    }
    Serial.print("Length = ");
    Serial.println(Sensors::_len);

    for (int j = 0; j < Sensors::_len; j++)
    {
        Serial.print(j);
        Serial.print(" = ");
        Serial.println(Sensors::Get(i).SlavePin);
    }
}

void loop() { //Nothing goes here }

此代码有效并且编译成功。但是当我运行它时,串口窗口会显示:

  

长度:6

     

传感器0:0

     

传感器1:0

     

传感器2:1

     

传感器3:2

     

传感器4:3

     

传感器5:4

显然,阵列中的第一项和第二项具有相同的价值,老实说,我不知道为什么。

这是我期待的输出:

  

长度:6

     

传感器0:0

     

传感器1:1

     

传感器2:2

     

传感器3:3

     

传感器4:4

     

传感器5:5

非常感谢任何帮助。顺便说一句,如果这种线程已经存在,我很抱歉。

1 个答案:

答案 0 :(得分:0)

第一次调用添加()会将结构置于索引1:

byte _len = 0;

void Add(Sensor s)
{
    if (_len > MAX_SENSOR)
        return;
    _len++;
    // On first call _len will be 1
    _sensors[_len] = s;
}

我理解这段代码的设计意图,但认为这对于微控制器来说是一种浪费的方法。

实现Add()会增加代码大小。用于台式计算机的库肯定会将代码大小评定为安全公平的权衡。用于微控制器的库很难评估为使用稀缺存储器。

实现Get()会增加代码大小和执行时间。同样,对于典型的桌面环境和您希望安全的库而言,这似乎是一个很好的设计。在微控制器上,这是错误的。

我认为关键决定因素的好坏是永久性成本与一次性节省。 Sensor的安全版本在部署的每个系统上以及程序运行的每一秒都会花费代码空间和执行时间。好处只是运行的第一天并调试程序。