Ошибка переноса с vc6 на vs2010

я застрял в портировании моего проекта с 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)

Пожалуйста, кто-нибудь может мне помочь с этим. мне жаль, если это не блестящий вопрос. Но быть дураком в течение пяти минут лучше, чем быть дураком навсегда.

Заранее спасибо.

0

Решение

Проблема лучше всего объясняется демонстрацией:

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,

1

Другие решения

GetBitsL требуется ссылка на указатель на const-UINT8. Вы даете ему ссылку на указатель на volatile-UINT8, и прямого перевода по ссылке нет. + Изменить pPdu быть таким:

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

Это все еще инициализируется, чтобы указать тот же UINT8 как Sdu, но теперь как указатель на const-UINT8, который ожидает функция. Функция все еще может изменить указатель, но не то, что это указывает на. (что должно указывать на то, что вы, возможно, не используете функцию как предназначенную для проектирования, так что учтите это).

1

По вопросам рекламы [email protected]