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

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

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

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

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

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

 paulsm403 апр. 2012 г., 05:20
Вы можете посмотреть здесь:andybrown.me.uk/ws/2011/01/15/...

Ответы на вопрос(5)

го где угодно:

#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());

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

Решение Вопроса

Стандартный C ++ для Arduino может быть вариант. Это позволяет вам использоватьСТЛ вектор в Ардуино.

 S. Salman10 авг. 2015 г., 19:58
У меня проблемы с использованием библиотеки fstream с использованием вышеупомянутого набора библиотек. #include <fstream> выдает мне следующую ошибку: фатальная ошибка: unistd.h: такого файла или каталога нет
 Julie in Austin30 апр. 2012 г., 06:15
Кроме того, очень полезно упомянуть тип Arduino, который вы используете. Решение, которое работает на Mega 2560, менее вероятно, будет работать на меньших и старых Arduinos. Просто предложение. Не стесняйтесь игнорировать :)
 jakebird45103 апр. 2012 г., 15:29
Вау, этот набор библиотек впечатляет. Спасибо за эту находку!
 PixMach16 сент. 2013 г., 08:24
Эта библиотека потрясающая.
 Suuuehgi08 окт. 2018 г., 13:37
Есть альтернатива, более свежий проектArduinoSTL также работает на Arduino Nano.

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

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

 Chris K31 июл. 2013 г., 23:55
Я не совсем понимаю ваш пример на вершине Github. Есть ли шанс, что вы сможете показать пример кода и ожидаемый результат в стиле php.net?
 Steven Jeffries20 мар. 2018 г., 08:24
@kritzikratzi и это имеет. 404
 kritzikratzi22 янв. 2018 г., 15:10
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. -Из обзора

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

Ваш ответ на вопрос