Как я периодически добавляю в массив с помощью Arduino IDE? - PullRequest
0 голосов
/ 12 марта 2020

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

1 Ответ

1 голос
/ 12 марта 2020

Arduino не выходит из коробки с динамическими c структурами данных (кроме String).

Вы можете загрузить реализации с открытым исходным кодом обобщенных контейнеров c из Интернета. Вот один из них: https://github.com/dhbikoff/Generic-C-Library/blob/master/vector.h

Кроме того, вот простой связанный список / вектор, который я реализовал как игрушечный проект.

Будьте осторожны с динамической c памятью , Фрагментация памяти может привести к случайному созданию вашего эскиза sh (случалось со мной несколько раз).

template <typename T>
struct SimpleVector {
    struct SimpleVectorNode {
        T* m_value = NULL;
        SimpleVectorNode* m_next = NULL;

        SimpleVectorNode() {

        }

        SimpleVectorNode(T val) {
            m_value = new T(val);
            m_next = NULL;
        }
    };
    int m_size = 0;
    SimpleVectorNode* m_head = new SimpleVectorNode;

    void AddValue(T val) {
        ++m_size;
        SimpleVectorNode* end = m_head;
        while (end->m_next != NULL) {
            end = end->m_next;
        }
        end->m_next = new SimpleVectorNode(val);
    }

    SimpleVectorNode* Seek(int index) {
        SimpleVectorNode* res = m_head;
        while (index >= 0) {
            --index;
            res = res->m_next;
        }
        return res;
    }

    T& Get(int index) {
        return *(Seek(index)->m_value);
    }

    void Delete(int index) {
        SimpleVectorNode* preDel = Seek(index - 1);
        SimpleVectorNode* toDel = preDel->m_next;
        preDel->m_next = toDel->m_next;
        delete toDel->m_value;
        delete toDel;
        --m_size;
    }

    int GetSize() {
        return m_size;
    }

    int IndexOf(T val) {
        SimpleVectorNode* pNode = m_head->m_next;
        for (int i = 0; i < m_size; ++i) {
            if (pNode->m_value == val) {
                return i;
            }

            pNode = pNode->m_next;
        }

        return -1;
    }

    bool Contains(T val) {
        return IndexOf(val) >= 0;
    }

    ~SimpleVector() {
        while (m_size > 0) {
            Delete(0);
        }

        delete m_head;
    }
};
...