C++ 引用字节数组
C++ reference byte array
我在使用 C++ 和创建引用 byte[] 时遇到问题。
在 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': arrays of references are illegal.
那么如何更改我的 C++ 代码以使用引用数组?
编辑:
我用这个方法来设置缓冲区,但是我用这个方法时它没有改变。
其他class:
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
但缓冲区没有改变。它的值相同。
'buffer': arrays of references are illegal.
这是由于运算符的优先级。说 byte &buffer[]
是引用数组,而说 byte (&buffer)[size]
是对数组的引用。
有关详细信息,请参阅 C++ pass an array by reference。
So how can I change my C++ code to work with a reference array?
将数组作为函数参数传递时,应删除 &
符号。您仍然可以修改数组的内容,因为传递的是数组的地址。
假设您的 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;
What is array decaying? 上的 post 应该有用。
不应该是这样吗:
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作为指针传递,buffer[Pos]引用buffer的Pos-th元素。它是普通的 C,但它应该可以工作。
如果你想通过引用传递数组,你应该
void SetBitAt(byte (buffer&)[10], int Pos, int Bit, bool Value)
但在你的情况下,你不需要那个,只是
void SetBitAt(byte buffer[], int Pos, int Bit, bool Value)
请注意,在这种情况下,数组将衰减为指针(即 byte*
),这意味着数组的大小不会像按引用传递那样保留。
您可以简单地通过地址传递它:
void SetBitAt(byte* buffer, int Pos, int Bit, bool Value) { ... }
或简称为:
void SetBitAt(byte buffer[], int Pos, int Bit, bool Value) { ... }
两者都会告诉编译器字节指针已传递给函数,尽管在第二个头文件中您省略了指针算法;)
我在使用 C++ 和创建引用 byte[] 时遇到问题。
在 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': arrays of references are illegal.
那么如何更改我的 C++ 代码以使用引用数组?
编辑: 我用这个方法来设置缓冲区,但是我用这个方法时它没有改变。
其他class:
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
但缓冲区没有改变。它的值相同。
'buffer': arrays of references are illegal.
这是由于运算符的优先级。说 byte &buffer[]
是引用数组,而说 byte (&buffer)[size]
是对数组的引用。
有关详细信息,请参阅 C++ pass an array by reference。
So how can I change my C++ code to work with a reference array?
将数组作为函数参数传递时,应删除 &
符号。您仍然可以修改数组的内容,因为传递的是数组的地址。
假设您的 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;
What is array decaying? 上的 post 应该有用。
不应该是这样吗:
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作为指针传递,buffer[Pos]引用buffer的Pos-th元素。它是普通的 C,但它应该可以工作。
如果你想通过引用传递数组,你应该
void SetBitAt(byte (buffer&)[10], int Pos, int Bit, bool Value)
但在你的情况下,你不需要那个,只是
void SetBitAt(byte buffer[], int Pos, int Bit, bool Value)
请注意,在这种情况下,数组将衰减为指针(即 byte*
),这意味着数组的大小不会像按引用传递那样保留。
您可以简单地通过地址传递它:
void SetBitAt(byte* buffer, int Pos, int Bit, bool Value) { ... }
或简称为:
void SetBitAt(byte buffer[], int Pos, int Bit, bool Value) { ... }
两者都会告诉编译器字节指针已传递给函数,尽管在第二个头文件中您省略了指针算法;)