代码之家  ›  专栏  ›  技术社区  ›  Gordon13

C++的内存和布尔数组

  •  -1
  • Gordon13  · 技术社区  · 7 年前

    我有一段代码将一个字符串写入内存,我正试图修改它来编写一个布尔数组。

    这个想法很简单,就是每次迭代都将随机布尔数据写入内存。

    下面是编写字符串的方法示例:

    void MemoryWriter::write(const string& data) {
        auto buffer = MapViewOfFile(m_shmHandler, FILE_MAP_ALL_ACCESS, 0, 0, m_memorySize);
        CopyMemory(buffer, data.c_str(), data.size());
    }
    

    下面是一个试图编写布尔值的非工作示例:

    void MemoryWriter::write(const bool * data) {
        auto buffer = MapViewOfFile(m_shmHandler, FILE_MAP_ALL_ACCESS, 0, 0, m_memorySize);
        CopyMemory(buffer, data, data.size());
    }
    

    bool* MemoryWriter::createRandomArduinoPinData() const {
        bool data[12];
        for (size_t i = 0; i < m_memorySize; i++) {
            data[i] = getRandomBool();
            std::cout << "C++: RandomArduinoPinData " << data[i] << std::endl;
        }
        return data;
    }
    

    主要功能如下:

    #include "stdafx.h"
    #include "MemoryWriter.h"
    #include <iostream>
    #include <string>
    #include <thread>
    
    
    int main()
    {
        std::wstring memoryName{ L"shm_1" };
        size_t memorySize{ 12 * sizeof(bool) };
        MemoryWriter writer(memoryName, memorySize);
    
        while (true) {
            bool* data;
            //data = writer.createRandomData();
            data = writer.createRandomArduinoPinData(); // <-- this generates the random bool array and is confirmed to work
            writer.write(data); <-- for some reason, this part doesn't receive the same array
            std::cout << "C++: Written in shm - " << data[0] << data[1] << data[2] << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
    
        return 0;
    }
    

    这里是控制台输出,显示正在生成的随机数据,以及输出的不同数据:

    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: Written in shm - 00AFFCE0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: Written in shm - 00AFFCE0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 1
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 0
    C++: RandomArduinoPinData 1
    C++: Written in shm - 00AFFCE0
    

    我想这可能是复写记忆的问题,但我不确定。指针和记忆仍然是我努力学习的东西,我很难解决这个问题。

    有什么想法吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Gordon13    7 年前

    这个问题与指针的使用有关。createRandomArduInInData函数返回一个指向内部变量的指针,该变量在函数结束时被擦除,这意味着该函数的返回值始终是指向空内存地址的指针。代码现在使用std::vector代替。

    已更新createRandomPinData函数:

    std::vector<bool> MemoryWriter::createRandomArduinoPinData() const {
        std::vector<bool> data(12);
        for (size_t i = 0; i < m_memorySize; i++) {
            data[i] = getRandomBool();
            std::cout << "C++: RandomArduinoPinData " << data[i] << std::endl;
        }
        return data;
    }
    

    更新的写入函数:

    void MemoryWriter::write(const std::vector<bool>& data) {
        auto buffer = MapViewOfFile(m_shmHandler, FILE_MAP_ALL_ACCESS, 0, 0, m_memorySize);
        CopyMemory(buffer, &data, data.size());
    }