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?

将数组作为函数参数传递时,应删除 & 符号。您仍然可以修改数组的内容,因为传递的是数组的地址。

假设您的 typedefcharbyte,您的函数签名应如下所示:

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) { ... }

两者都会告诉编译器字节指针已传递给函数,尽管在第二个头文件中您省略了指针算法;)