繁体   English   中英

在微控制器上用C ++调整动态数组的大小是否是一个好主意

[英]Is it a good idea to resize a dynamic array in C++ on a Microcontroller

我正在构建模型的铁路道口信号,并正在研究微控制器代码以使其起作用。 我遇到了一个问题,使我对自己的方法提出了质疑。

一旦火车触发进入交叉口区域,我将读取RFID标签(每辆车内都装有一个),并将标签编号放入一个阵列中。 问题在于,很可能总是需要调整阵列的大小,因为并非每列火车都有相同数量的汽车,因此也有相同数量的RFID标签。 我需要捕获最后一个汽车标签,因为我需要从出口区RFID读取器中监视该标签,因此我知道何时关闭门并关闭闪光灯。 另外,当发现新标签时,我可以对汽车进行计数,并且与出口区域中的计数恰好匹配,因此不需要数组。

除了数组,还有一种更有效的方法吗? 我是C#专家,所以并不是所有人都非常熟悉C ++中的处理方法,指针以及所有附带的内容。

另一个想法是放弃数组,只用读取的每个标签替换一个tagID变量,以为最后一个汽车标签将一直存在于变量中,并匹配进入和退出汽车数量,这可能是最简单的解决方案。

对最佳方法有何想法?

在现实世界的铁路道口中,这最终会影响人们的安全。 尽管这只是一个模型,但它可能是使您思考在现实世界中可能遇到的事物类型的好练习(因为这只是放大的版本,其后果会更大)。

我建议:

  • 使代码尽可能简单;
  • 提供内部验证措施,以确保假设符合实际情况;
  • 定义了恢复程序,以在上述验证失败时进行处理;
  • 编写单元测试以验证所有边缘情况和模式异常操作(如果您具有强迫性)。

除非您真的知道自己在做什么,否则不建议在微控制器环境中使用动态内存。 内存不足并由于意外碎片而崩溃是一个非常实际的问题。

一种简单的方法是记录第一个标签,最后一个标签和标签数量。 这样,您可以对启动和退出滑架进行一些完整性检查,并确保退出的滑架数量与输入的数量相同。 如果不是,请进入某种警报恢复状态,在其中记录问题,并可能使用超时或其他检测来确定可以安全举起手臂。

另一种方法是制作一个静态数组,该数组足以存储比两个检测器之间实际容纳的托架更多的托架,并将其用作环形缓冲区。 这样,您可以验证每辆车离开交叉路口时的情况。

如果您确实需要使用动态内存,请继续。 但是请考虑,如果这样的系统可能由于分配失控而失败,那么任何静态阵列解决方案也可能在这种情况下失败。 您可能需要重新考虑您的方法。

为了避免指针和手动分配内存,您可以使用该类

std::vector

向量是表示可以改变大小的数组的序列容器。

您可以在此处了解更多信息

好吧, 过境口区域一次只能容纳有限数量的车辆。 是不是

您可以做的是基于std::array<tagId,MAX_SLOTS>实现某种大小固定的队列,并保留实际可用的传入插槽索引。

我会做这样的事情:

template<class T, size_t max>
class ResizeableArray{
    T array[max];
    size_t end;
  public:
    void addLast(T value){
      array[end] = value;
      end++;  //Maybe check before you do this
    }
    size_t size(){
      return end;
    }
    T operator[](size_t index){
      return array[index];  //Maybe do a check here?
    }
    void RemoveLast(){
      end--;
      array[end].~T();  //Destroy the object
    }
};

然后,您可以像这样使用:

ResizeableArray<TrainCar,32> cars;  //Max size of 32
cars.addLast(TrainCar());
cars.addLast(TrainCar());
cars.addLast(TrainCar());
cars.addLast(TrainCar());
if (cars[1].someMethod())
  doSomthing();

真正的好处是使用此方法没有动态内存初始化,如果您使用的是微型内存,我肯定会建议这样做。 另一个好处是它的行为(某种程度上)就像内置的列表持有者。 如果您想要更多功能,可以添加它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM