我在看过其他人的许多有用的交流之后,在这里发表我的第一个问题;这是非常令人兴奋!我认为这个问题的解答相当简单,但我希望有人能够解释它,因为它让我感到烦恼。
我有一个函数接受作为字节指针传入的字节数组,程序的多个层更低。变量是定义为
的类的成员m_GpsInputBuf[GpsInputBuflen];
有问题的函数接收指向该数组的指针,如下面的代码所示。当数据包的校验和未被验证并且数据包的另一个同步字符位于数据包主体内时,该函数只是将数组中的字节向左移动。关于函数目的的所有问题除外,我感兴趣的是将temp数组复制到参数字节数组指针。
pPacketbuf变量的副本就像我希望的那样发生,但是当函数终止时,存在于ScanAndShift()函数调用级别的pPacketbuf变量不受影响。这与ScanAndShift()作为指针变量的副本的参数有关,我相信,但我现在太接近问题无法理解它了。任何见解?代码如下:
int CFlirPumpDlg::ScanAndShift(BYTE *pPacketbuf)
{
int idx3 = 0;
BYTE tempGpsInputBuf[GpsInputBuflen];
for(int idx = 1; idx < GpsInputBuflen; idx++)
{
if(pPacketbuf[idx] == CFlirPumpApp::GPS_Start)
{
idx3 = idx;
for(int idx2 = 0; idx2 < (GpsInputBuflen - idx); idx2++)
{
tempGpsInputBuf[idx2] = pPacketbuf[idx3++];
}
pPacketbuf = (BYTE *)&tempGpsInputBuf;
return (GpsInputBuflen - idx);
}
}
return 0;
}
答案 0 :(得分:2)
这里有两种方式。
1)您分配一个新缓冲区并用字节填充它。为此,您需要更改您的函数以采用这样的双指针:
int CFlirPumpDlg::ScanAndShift(BYTE **pPacketbuf)
但是,你必须分配一个新缓冲区而不是声明它。像这样:
BYTE* tempGpsInputBuf = malloc(...);
你必须改变这个:
pPacketbuf = (BYTE *)&tempGpsInputBuf;
进入这个:
pPacketbuf = tempGpsInputBuf;
同样,pPacketbuf
中的所有索引应该像这样完成:
*pPacketbuf[index]
你必须考虑释放'旧'缓冲区。
2)您可以使用tempGpsInputBuf
将pPacketbuf
的字节复制回memcpy
。
或者您可以选择3.选项,即更改算法以执行pPacketbuf
中的所有工作。我不知道这是否可能。
我个人会选择2.或3.选项。