簡體   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