繁体   English   中英

C++ CopyMemory 和布尔数组

[英]C++ CopyMemory and array of booleans

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

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

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

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 的问题,但我不确定。 指针和内存仍然是我正在努力学习的东西,我很难弄清楚这个问题。

有任何想法吗?

该问题与指针的使用有关。 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());
}

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

随机函数返回相同的值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM