0

我被困在我的项目从 VC6 到 VS2010 的移植中。请任何人都可以帮助我。

void CEdchLoop::ReceiveSdu(UINT8* Sdu, UINT32 BitLength, int Fn)
{
UINT8* pPdu   = Sdu;
    int Bit       = 8;

    UINT32 SourceId    = GetBitsL(pPdu, BitLength, Bit, 32);
    UINT32 PduUniqueId = GetBitsL(pPdu, BitLength, Bit, 32);       
}

在上面的代码中,我收到错误 C2664: 'GetBitsL' : cannot convert parameter 1 from 'UINT8 *' to 'const UINT8 *&'

和 GetBitsL 被定义为UINT32 GetBitsL(const UINT8*& Bin, UINT32& BitLength, int& Bit, int Count)

请任何人都可以帮我解决这个问题。如果这不是一个绝妙的问题,我很抱歉。但是傻五分钟总比永远傻好。

提前致谢。

4

2 回答 2

1

GetBitsL需要引用指向 const-UINT8 的指针。您正在给它一个指向 volatile-UINT8 的指针的引用,并且没有直接的按引用转换。通过以下方式更改pPdu为:

// UINT8* pPdu   = Sdu;
const UINT8* pPdu(Sdu);

它仍然初始化为指向与 相同的点UINT8Sdu但现在作为函数期望的指向 const-UINT8 的指针。该函数仍然可以修改指针,但不能修改它指向的内容。(这应该暗示您可能没有按照设计意图使用该功能,因此请考虑一下)。

于 2013-04-12T04:48:44.003 回答
1

这个问题最好用一个演示来解释:

int * ip;
const int *& cipr = ip;

好的,至此,cipr是对ip. 这是不合法的,您将在以下部分中看到原因。

const int * cip = some_const_data;
cipr = cip;

该赋值是合法的,因为作为指向 const 数据的指针(引用),cipr允许将其分配为指向 const 数据。但正因为如此,sincecipr是对ip, 现在ip指向 const 数据的引用。这是一个问题:

*ip = 7;

这是合法的,因为 of 的类型ip是指向非常量 int 的指针。但是,通过上面的一些技巧,我们使它指向 const 数据。这是不允许的,因此我们必须cipr引用的初始声明ip必须是非法的。这与您通过传递pPduGetBitsL.

于 2013-04-12T04:53:56.227 回答