ref — C ++ массив байтов

У меня проблема с C ++ и созданием ссылочного байта [].

В C # мой метод:

public static void SetBitAt(ref byte[] Buffer, int Pos, int Bit, bool Value)
{
byte[] Mask = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
if (Bit < 0) Bit = 0;
if (Bit > 7) Bit = 7;

if (Value)
Buffer[Pos] = (byte)(Buffer[Pos] | Mask[Bit]);
else
Buffer[Pos] = (byte)(Buffer[Pos] & ~Mask[Bit]);
}

Я хочу перевести его на C ++, но не могу получить refработает на C ++. Я видел кое-что о & символ и я попробовал что-то вроде этого:

void SetBitAt(byte& buffer[], int Pos, int Bit, bool Value)
{
byte Mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
if (Bit < 0) Bit = 0;
if (Bit > 7) Bit = 7;

if (Value)
{
buffer[Pos] = (byte)(buffer[Pos] | Mask[Bit]);
}
else
{
buffer[Pos] = (byte)(buffer[Pos] & ~Mask[Bit]);
}
}

но тогда я получаю ошибку:

‘buffer’: массивы ссылок недопустимы.

Итак, как я могу изменить свой код C ++ для работы с массивом ссылок?

РЕДАКТИРОВАТЬ:
Я использую этот метод для установки буфера, но он не меняется, когда я использую этот метод.

другой класс:

buffer = ReadDB(2);          //Read the values in the DataBlock
SetBitAt(buffer, 0,0 true);  //Set bit 0,0 to 1(true)
WriteDB(2, buffer);          //Write the values to the Datablock

но буфер не меняется. это то же самое значение.

2

Решение

Если вы хотите передать массив по ссылке, вы должны

void SetBitAt(byte (buffer&)[10], int Pos, int Bit, bool Value)

Но в вашем случае вам это не нужно, просто

void SetBitAt(byte buffer[], int Pos, int Bit, bool Value)

Обратите внимание, что в этом случае массив будет уменьшаться до указателя (т.е. byte*), это означает, что размер массива не будет зарезервирован, как при передаче по ссылке.

4

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

‘buffer’: массивы ссылок недопустимы.

Это связано с приоритетом оператора. поговорка byte &buffer[] это массив ссылок, при этом говоря byte (&buffer)[size] это ссылка на массив.

Увидеть C ++ передать массив по ссылке Больше подробностей.

Итак, как я могу изменить свой код C ++ для работы с массивом ссылок?

При передаче вашего массива в качестве аргумента функции вы должны удалить & условное обозначение. Вы все еще можете изменить содержимое вашего массива, потому что вместо него передается адрес массива.

Если у вас есть typedef из char в byteподпись вашей функции должна выглядеть так:

void SetBitAt(byte buffer[], int Pos, int Bit, bool Value) { ... }

Обратите внимание, что вышесказанное эквивалентно передаче указателя:

void SetBitAt(byte *buffer, int Pos, int Bit, bool Value) { ... }

Изменение содержимого вашего массива все еще остается вопросом buffer[Pos] = // some value;

Этот пост на Что такое распадающийся массив? должно быть полезно.

1

Разве это не должно быть просто так:

void SetBitAt(byte buffer[], int Pos, int Bit, bool Value)
{
byte Mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
if (Bit < 0) Bit = 0;
if (Bit > 7) Bit = 7;

if (Value)
{
buffer[Pos] = (byte)(buffer[Pos] | Mask[Bit]);
}
else
{
buffer[Pos] = (byte)(buffer[Pos] & ~Mask[Bit]);
}
}

Таким образом, буфер передается как указатель, а buffer [Pos] ссылается на Pos-й элемент буфера. Это просто C, но это должно работать.

0

Вы можете передать его просто по адресу как:

void SetBitAt(byte* buffer, int Pos, int Bit, bool Value) { ... }

или просто как:

void SetBitAt(byte buffer[], int Pos, int Bit, bool Value) { ... }

Любой из них сообщит компилятору, что байтовый указатель передается в функцию, хотя со вторым заголовком вы пропускаете арифметику указателей;)

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