C ++ CopyMemory和布尔数组

时间:2018-08-19 23:59:41

标签: c++ pointers

我有一段代码将一个字符串写到内存中,并且我正在尝试修改它以写一个布尔数组。

这个想法仅仅是为每次迭代将随机布尔数据写入内存。

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

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

如您所见,正在生成随机数据,但结果始终相同:00AFFCE0。尽管没有打印数组,但我仍然希望每次都会有所不同,因为基础数据应该不同

我认为这可能与CopyMemory有关,但我不确定。指针和内存仍然是我要学习的东西,而且我很难解决这个问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

该问题与指针的使用有关。 createRandomArduinoPinData函数正在返回指向内部变量的指针,该指针在函数末尾被擦除,这意味着该函数的返回值始终是指向空内存地址的指针。该代码现在改为使用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());
}

答案 1 :(得分:0)

createRandomArduinoPinData函数也不能以这种方式返回数组(您可以使用std :: vector或std :: list),但是您的问题是因为没有播种随机函数。

random function returns the same value