如何访问通过指针访问的结构体向量中的数据

问题描述 投票:0回答:1

我正在尝试在启用 PSRAM 的 ESP32-S3 上的 PSRAM 中创建向量。 这是我的测试代码(使用 std=gnu++14)。

我可以:分配一些 PSRAM 内存,在 PSRAM 中创建一个向量,创建一个测试记录并将其添加到向量中并确认大小增加,从向量的开头删除记录并确认大小减少

但是我不知道如何读取矢量数据,请参阅中间注释掉的块。

struct EventRecord_t { // owned by MESH_ROOT
    uint8_t  node = 0;
    uint8_t errorCount;
};

void eventsStart(){
    void* eventsRam;
    eventsRam = heap_caps_malloc(1000000, MALLOC_CAP_SPIRAM); // get memory from PSRAM
    std::vector<EventRecord_t>* eventStack; // declare pointer to vector of struct
    eventStack = (std::vector<EventRecord_t>*) eventsRam; // create vector in PSRAM
    EventRecord_t eventRecord; // create record entry and populate it
    eventRecord.node = 1;
    eventRecord.errorCount = 34;
    eventStack->push_back(eventRecord); // add record to eventstack 
    std::cout << "Size: " << eventStack->size() << std::endl; // confirm size is increasing
    eventRecord.node = 2;
    eventStack->push_back(eventRecord);
    std::cout << "Size: " << eventStack->size() << std::endl;
    eventRecord.node = 3;
    eventStack->push_back(eventRecord);
    std::cout << "Size: " << eventStack->size() << std::endl;

    // how to access eventStack data here;
    // eventRecord = eventStack[0];
    // uint8_t inode = eventStack[0]->node;

    eventStack->erase(eventStack->begin()); // delete first record from eventStack
    std::cout << "Size: " << eventStack->size() << std::endl; // confirm size is increasing
    eventStack->erase(eventStack->begin());
    std::cout << "Size: " << eventStack->size() << std::endl;
    eventStack->erase(eventStack->begin());
    std::cout << "Size: " << eventStack->size() << std::endl;
    free(eventsRam);
}

输出:

Size: 1
Size: 2
Size: 3
Size: 2
Size: 1
Size: 0
c++ esp32
1个回答
0
投票

你需要编写自己的分配器

template <typename T>
class SPIRamAllocator {
public:
    using value_type = T;

    SPIRamAllocator() = default;

    template <typename U>
    constexpr SPIRamAllocator(const SPIRamAllocator<U>&) noexcept {}

    [[nodiscard]] T* allocate(std::size_t n) {
        // Allocate memory using heap_caps_malloc with MALLOC_CAP_SPIRAM
        T* ptr = static_cast<T*>(heap_caps_malloc(n * sizeof(T), MALLOC_CAP_SPIRAM));
        if (!ptr) {
            /* do something */
        }
        return ptr;
    }

    void deallocate(T* ptr, std::size_t) noexcept {
        // Free the allocated memory
        heap_caps_free(ptr);
    }
};

template <typename T, typename U>
bool operator==(const SpirAMAllocator<T>&, const SpirAMAllocator<U>&) {
    return true;
}

template <typename T, typename U>
bool operator!=(const SpirAMAllocator<T>&, const SpirAMAllocator<U>&) {
    return false;
}

然后就可以使用它了:

std::vector<int, SpirAMAllocator<int>> vec;

这个分配器不太好,但它只是展示如何编写它们。您可能想要为向量提供最大大小、分配更大的块或结合任何其他方法。

© www.soinside.com 2019 - 2024. All rights reserved.