я застрял в портировании моего проекта с 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»: невозможно преобразовать параметр 1 из «UINT8 *» в «const UINT8 *»&’
и GetBitsL определяется как UINT32 GetBitsL(const UINT8*& Bin, UINT32& BitLength, int& Bit, int Count)
Пожалуйста, кто-нибудь может мне помочь с этим. мне жаль, если это не блестящий вопрос. Но быть дураком в течение пяти минут лучше, чем быть дураком навсегда.
Заранее спасибо.
Проблема лучше всего объясняется демонстрацией:
int * ip;
const int *& cipr = ip;
Хорошо, на данный момент, cipr
это ссылка на ip
, Это не законно, вы поймете почему в следующих разделах.
const int * cip = some_const_data;
cipr = cip;
Это назначение было законным, потому что, будучи указателем на константные данные, cipr
разрешено назначать для указания на постоянные данные. Но из-за этого, так как cipr
это ссылка на ip
, сейчас ip
указывает на постоянные данные. Это проблема:
*ip = 7;
Это законно, потому что тип ip
это указатель на неконстантный int. Тем не менее, с помощью некоторых хитростей, приведенных выше, мы указали на постоянные данные. Это нельзя допустить, и поэтому наше первоначальное утверждение, где мы связаны cipr
ссылаясь на ip
должен быть незаконным. И это то же самое, что вы пытаетесь сделать, передавая pPdu
в GetBitsL
,
GetBitsL
требуется ссылка на указатель на const-UINT8. Вы даете ему ссылку на указатель на volatile-UINT8, и прямого перевода по ссылке нет. + Изменить pPdu
быть таким:
// UINT8* pPdu = Sdu;
const UINT8* pPdu(Sdu);
Это все еще инициализируется, чтобы указать тот же UINT8
как Sdu
, но теперь как указатель на const-UINT8, который ожидает функция. Функция все еще может изменить указатель, но не то, что это указывает на. (что должно указывать на то, что вы, возможно, не используете функцию как предназначенную для проектирования, так что учтите это).