Векторы в Ардуино - PullRequest
       5

Векторы в Ардуино

47 голосов
/ 03 апреля 2012

Я делаю вектор "путевых точек" на Arduino.Каждая путевая точка является объектом.Очевидно, что Arduino нужно будет хранить несколько путевых точек для навигации по путевым точкам.Но вместо того, чтобы хранить эти путевые точки в стандартном предварительно запрограммированном массиве, пользователь должен иметь возможность добавлять, удалять путевые точки и перемещать их.К сожалению, Arduino не предлагает векторный тип как встроенную библиотеку.

В настоящее время я рассматриваю два варианта:

  1. In Контейнер дляобъекты типа C ++ 'vector'? , кто-то опубликовал библиотеку общего назначения.Он не содержит ни удаления индекса, ни операций перемещения.Но он содержит некоторые стратегии управления памятью.

  2. Я использовал malloc , dealloc, calloc в прошлом.Но мне не нравится этот вариант вообще, особенно с классами.Но разве это лучший вариант в моем сенарио?

Какой из путей лучше спуститься?

Ответы [ 5 ]

53 голосов
/ 03 апреля 2012

Стандартный C ++ для Arduino может быть вариантом.Он позволяет вам использовать STL vector в Arduino.

4 голосов
/ 27 декабря 2012

Звучит так, как если бы вы хотели реализовать простой связанный список.Связанный список позволяет вам перемещать объекты (в вашем случае путевые точки) без издержек, связанных с векторами C ++.

Вот реализация на GitHub .

2 голосов
/ 08 сентября 2012

Arduino имеет ограниченную память, поэтому вам нужно знать, сколько путевых точек вы допустите.В этом случае простой массив для хранения указателей (адресов) выделенных путевых точек обеспечит необходимую вам последовательность / порядок.Если освободить один слот массива в качестве рабочей области, можно будет перемещать путевые точки (переупорядочивать).

1 голос
/ 13 января 2019

Вы можете написать этот класс шаблона LinkedList и просто вызывать его где угодно:

#ifndef LinkedList_hpp
#define LinkedList_hpp


template <class T>
class ListNode {
  public:
    T element;
    ListNode* next;
    ListNode* prev;

    ListNode(T element, ListNode* prev, ListNode* next) : element(element)
    {
      this->next = next;
      this->prev = prev;
    };
};

template <class T>
class LinkedList  {
  private:
    int length;
    ListNode<T>* head;
    ListNode<T>* tail;
    ListNode<T>* curr;
  public:
    LinkedList();
    LinkedList(const LinkedList<T>&);
    ~LinkedList();
    T& getCurrent();
    T& First() const;
    T& Last() const;
    int getLength();
    void Append(T);
    void DeleteLast();
    void DeleteFirst();
    void DeleteCurrent();
    bool next();
    bool moveToStart();
    bool prev();
    void Delete(T&);
    bool Search(T);
    void Clear();
    void PutFirstToLast();
    void Update(T elem);
    LinkedList& operator = (const LinkedList<T>&);
};

template <class T>
LinkedList<T>::LinkedList() {
    length = 0;
    head = nullptr;
    tail = nullptr;
    curr = nullptr;
}

template <class T>
LinkedList<T>::LinkedList(const LinkedList<T> & list) {
    length = 0;
    head = nullptr;
    tail = nullptr;
    curr = nullptr;

    ListNode<T> * temp = list.head;

    while(temp != nullptr)
    {
        Append(temp->element);
        temp = temp->next;
    }
}

template <class T>
LinkedList<T> & LinkedList<T>::operator=(const LinkedList<T> & list)
{
    Clear();

    ListNode<T> * temp = list.head;

    while(temp != nullptr)
    {
        Append(temp->element);
        temp = temp->next;
    }

    return *this;
}

template <class T>
LinkedList<T>::~LinkedList() {
    Clear();
}

template<class T>
T& LinkedList<T>::getCurrent()
{
  return curr->element;
}

template<class T>
T& LinkedList<T>::First() const
{
  return head->element;
}

template<class T>
T& LinkedList<T>::Last() const
{
  return tail->element;
}

template<class T>
int LinkedList<T>::getLength()
{
  return length;
}

template <class T>
void LinkedList<T>::Append(T element)
{
    ListNode<T> * node = new ListNode<T>(element, tail, nullptr);

    if(length == 0)
        curr = tail = head = node;
    else {
        tail->next = node;
        tail = node;
    }

    length++;

}

template <class T>
void LinkedList<T>::DeleteLast()
{
    if(length == 0)
      return;
    curr = tail;
    DeleteCurrent();
}

template <class T>
void LinkedList<T>::DeleteFirst()
{
    if(length == 0)
      return;
    curr = head;
    DeleteCurrent();
}

template <class T>
bool LinkedList<T>::next()
{
    if(length == 0)
        return false;

    if(curr->next == nullptr)
        return false;

    curr = curr->next;
    return true;
}

template <class T>
bool LinkedList<T>::moveToStart()
{
    curr = head;
    return length != 0;
}

template<class T>
bool LinkedList<T>::prev()
{
    if(length == 0)
        return false;

    if(curr->prev != nullptr)
        return false;

    curr = curr->prev;
    return true;
}

template <class T>
void LinkedList<T>::Delete(T & elem)
{
    if(Search(elem))
        DeleteCurrent();
}

template <class T>
void LinkedList<T>::DeleteCurrent()
{
    if(length == 0)
        return;
    length--;
    ListNode<T> * temp = curr;

    if(temp->prev != nullptr)
        temp->prev->next = temp->next;
    if(temp->next != nullptr)
        temp->next->prev = temp->prev;

    if(length == 0)
        head = curr = tail = nullptr;
    else if(curr == head)
        curr = head = head->next;
    else if(curr == tail)
        curr = tail = tail->prev;
    else
        curr = curr->prev;

     delete temp;
}

template <class T>
bool LinkedList<T>::Search(T elem)
{
    if(length == 0)
        return false;
    if(moveToStart())
        do {
            if(curr->element == elem)
                return true;
        } while (next());
    return false;
}

template <class T>
void LinkedList<T>::PutFirstToLast()
{
  if(length < 2)
    return;
  ListNode<T>* temp = head->next;
  head->next->prev = nullptr;
  head->next = nullptr;
  head->prev = tail;
  tail->next = head;
  tail = head;
  head = temp;
}

template <class T>
void LinkedList<T>::Update(T elem)
{
    if(Search(elem))
        curr->element = elem;
}

template <class T>
void LinkedList<T>::Clear()
{
    if(length == 0)
        return;
    ListNode<T> * temp = head;

    while(temp != nullptr)
    {
        head = head->next;
        delete temp;
        temp = head;
    }

    head = curr = tail = nullptr;

}


#endif

Используйте этот класс следующим образом:

LinkedList<int> list;

list.Append(1);
list.Append(2);
list.Append(3);
list.Append(4);

int my_integer;

if(list.moveToStart())
    do{
        my_integer = list.getCurrent();
    }while(list.next());
0 голосов
/ 24 мая 2015

Вы также можете иметь фиксированный массив структур путевых точек и включать переменную в структуру, если путевая точка используется или нет.При добавлении путевой точки все, что вам нужно, это пройти по массиву, пока вы не найдете структуру, которая не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...