2013-04-12 64 views
0

我被困在我的項目從VC6到VS2010的移植。請任何人幫助我。vc6 vs 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':不能從 'UINT8 *' 轉換參數1至 'const的UINT8 * &'

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

請任何人都可以幫助我。如果它不是一個很好的問題,我很抱歉。但是五分鐘的傻瓜總比永遠做一個傻瓜更好。

在此先感謝。

回答

1

GetBitsL要求引用指向const-UINT8的指針。你給它提供了一個指向volatile的指針UINT8,並且沒有直接的參考轉換。更改pPdu是由:

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

它仍然是初始化爲指向同一UINT8Sdu,但現在作爲指針給const-UINT8該函數的期望。該功能仍然可以修改指針,但不會指向指向。 (這應該是暗示你可能沒有將該功能用作設計意圖,所以考慮這一點)。

1

的問題最好用演示解釋說:

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

好吧,在這一點上,ciprip參考。這是不合法的,你會看到爲什麼在以下部分。

const int * cip = some_const_data; 
cipr = cip; 

即分配是合法的,因爲,作爲一個(參照)的指針常量數據,cipr允許被分配給指向常數數據。但正因爲如此,ciprip的參考,現在ip指向常數數據。這是一個問題:

*ip = 7; 

這是合法的,因爲ip類型爲指向非const int類型。但是,通過上面的一些技巧,我們將它指向了const數據。這是不允許的,所以我們最初的聲明,我們綁定cipr來引用ip必須是非法的。通過將pPdu傳遞給GetBitsL,您正在嘗試做的事情也是如此。