我有一段代码将一个字符串写到内存中,并且我正在尝试修改它以写一个布尔数组。
这个想法仅仅是为每次迭代将随机布尔数据写入内存。
这是编写字符串的方法示例:
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有关,但我不确定。指针和内存仍然是我要学习的东西,而且我很难解决这个问题。
有什么想法吗?
答案 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),但是您的问题是因为没有播种随机函数。