[英]Is it a good idea to resize a dynamic array in C++ on a Microcontroller
我正在構建模型的鐵路道口信號,並正在研究微控制器代碼以使其起作用。 我遇到了一個問題,使我對自己的方法提出了質疑。
一旦火車觸發進入交叉口區域,我將讀取RFID標簽(每輛車內都裝有一個),並將標簽編號放入一個陣列中。 問題在於,很可能總是需要調整陣列的大小,因為並非每列火車都有相同數量的汽車,因此也有相同數量的RFID標簽。 我需要捕獲最后一個汽車標簽,因為我需要從出口區RFID讀取器中監視該標簽,因此我知道何時關閉門並關閉閃光燈。 另外,當發現新標簽時,我可以對汽車進行計數,並且與出口區域中的計數恰好匹配,因此不需要數組。
除了數組,還有一種更有效的方法嗎? 我是C#專家,所以並不是所有人都非常熟悉C ++中的處理方法,指針以及所有附帶的內容。
另一個想法是放棄數組,只用讀取的每個標簽替換一個tagID變量,以為最后一個汽車標簽將一直存在於變量中,並匹配進入和退出汽車數量,這可能是最簡單的解決方案。
對最佳方法有何想法?
在現實世界的鐵路道口中,這最終會影響人們的安全。 盡管這只是一個模型,但它可能是使您思考在現實世界中可能遇到的事物類型的好練習(因為這只是放大的版本,其后果會更大)。
我建議:
除非您真的知道自己在做什么,否則不建議在微控制器環境中使用動態內存。 內存不足並由於意外碎片而崩潰是一個非常實際的問題。
一種簡單的方法是記錄第一個標簽,最后一個標簽和標簽數量。 這樣,您可以對啟動和退出滑架進行一些完整性檢查,並確保退出的滑架數量與輸入的數量相同。 如果不是,請進入某種警報恢復狀態,在其中記錄問題,並可能使用超時或其他檢測來確定可以安全舉起手臂。
另一種方法是制作一個靜態數組,該數組足以存儲比兩個檢測器之間實際容納的托架更多的托架,並將其用作環形緩沖區。 這樣,您可以驗證每輛車離開交叉路口時的情況。
如果您確實需要使用動態內存,請繼續。 但是請考慮,如果這樣的系統可能由於分配失控而失敗,那么任何靜態陣列解決方案也可能在這種情況下失敗。 您可能需要重新考慮您的方法。
好吧, 過境口區域一次只能容納有限數量的車輛。 是不是
您可以做的是基於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.