我想要读回存储在缓冲区中的数据。我有一个函数,它将指向unsigned char数组的指针作为参数。我希望这个参数被填充(指向)我想要获取的缓冲区的地址。
在函数内部我可以看到调试时传入的参数正在正确更新(Mock类),但是一旦我从这个函数返回到调用方法(Connection类),所有数据都会丢失。
请有人帮我理解为什么会这样吗?
先谢谢
///单元测试失败,因为预期的数据不在缓冲区中
TEST(MemoryTest, TestWriteAndRead)
{
Connection* p_conneciton = new Connection();
/// Write
uint8_t txBuffer[_USB_PACKET_SIZE] = _CMD;
ASSERT_EQ(p_memory->Write(txBuffer), true);
/// Read
uint8_t* rxBuffer;
ASSERT_EQ(p_memory->Read((unsigned char*)&rxBuffer), true);
ASSERT_EQ(rxBuffer[0], 0xaa);
}
/// Information is lost here in _pu8_buffer
bool Connection::Read(uint8_t* _pu8_buffer)
{
int i_bytesRead = 0;
while(i_bytesRead != SIZE) {
i_bytesRead = read_timeout(_pu8_buffer, _PACKET_SIZE);
if ( i_bytesRead < _PACKET_SIZE) {
return false;
}
}
return true;
}
/// Information is copied correctly here from mpuc_data to data
int Mock:read_timeout(unsigned char* data, size_t length)
{
if (data == nullptr) {
return -1;
}
data = mpuc_data;
return 0;
}
答案 0 :(得分:1)
/// Information is lost here in _pu8_buffer
bool Connection::Read(uint8_t* _pu8_buffer)
{
int i_bytesRead = 0;
while(i_bytesRead != SIZE) {
i_bytesRead = read_timeout(_pu8_buffer, _PACKET_SIZE);
if ( i_bytesRead < _PACKET_SIZE) {
return false;
}
}
return true;
}
调用此函数会获取传递给它的指针的副本。这意味着如果更改指针指向的位置,则只更改本地副本。
您可以更改将read_timeout
中的数据设置为:
*data = mpuc_data;
或者您将指针传递到uint8_t**
中的指针(Connection::Read
)并调用read_timeout(&_pu8_buffer, _PACKET_SIZE);
此外,您目前的方式&rxBuffer
不正确,应为rxBuffer
。如果您将签名更改为uint8_t**
,则仅传递地址。
答案 1 :(得分:1)
您需要传递要修改的参考参数。如果你想修改一个指针的值,你需要通过引用传递指针 - 它本身就是一个引用(对其他东西)没有帮助。
尝试
int Mock:read_timeout(unsigned char*& data, size_t length)
{
if (data == nullptr) {
return -1;
}
data = mpuc_data;
return 0;
}
这样,_pu8_buffer
实际上会在每次调用mpuc_data
后指向read_timeout
。您可以使用函数Read
执行相同的操作。
一般来说,要注意间接水平。与
uint8_t* rxBuffer;
ASSERT_EQ(p_memory->Read((unsigned char*)&rxBuffer), true);
您正在获取uint8_t*
的地址,获得指向指针的uint8_t**
指针。然后你把它投到unsigned char*
- 一个简单的,而不是双指针! (然后隐含地uint8_t*
当它成为参数时)它不能很好地结束......并且它以尝试读取字符数组结束,其中前4或8实际上是字节你的指针,其次是其他垃圾。
如果要修改指针的地址是正确的,但是您需要在另一侧获得uint8_t**
,并将其称为*_pu8_buffer
。