У меня проблема с 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
но буфер не меняется. это то же самое значение.
Если вы хотите передать массив по ссылке, вы должны
void SetBitAt(byte (buffer&)[10], int Pos, int Bit, bool Value)
Но в вашем случае вам это не нужно, просто
void SetBitAt(byte buffer[], int Pos, int Bit, bool Value)
Обратите внимание, что в этом случае массив будет уменьшаться до указателя (т.е. byte*
), это означает, что размер массива не будет зарезервирован, как при передаче по ссылке.
‘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;
Этот пост на Что такое распадающийся массив? должно быть полезно.
Разве это не должно быть просто так:
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, но это должно работать.
Вы можете передать его просто по адресу как:
void SetBitAt(byte* buffer, int Pos, int Bit, bool Value) { ... }
или просто как:
void SetBitAt(byte buffer[], int Pos, int Bit, bool Value) { ... }
Любой из них сообщит компилятору, что байтовый указатель передается в функцию, хотя со вторым заголовком вы пропускаете арифметику указателей;)