有条件地初始化数组

use*_*421 3 c c++ arrays if-statement initialization

我希望数组根据条件具有两个不同的值。我可以用我想要的值初始化条件内的数组。

if (myCondition == 0)
{
  byte my_message[8] = {0x00, 0xAB, 0xEE, 0xFF, 0x00, 0x01, 0x0A, 0x0B};
}
else if (myCondition == 1)
{
  byte my_message[8] = {0x11, 0xA1, 0xBC, 0x71, 0x00, 0x02, 0x94, 0x10};
}
Run Code Online (Sandbox Code Playgroud)

先前方法的问题是数组具有本地范围,并且下面的代码无法“看到”它。

如果我尝试在条件之外声明数组:

byte my_message[8];
Run Code Online (Sandbox Code Playgroud)

然后,在条件内,我不能使用以前的方式一次性初始化整个数组。

数据中没有模式,因此我可以for在条件内使用循环,以便轻松地为数组的每个元素赋予值。

除了麻烦之外,还有一种给数组赋值的方法吗:

if (myCondition == 0)
{
  my_message[0] = {0x00}; 
  my_message[1] = {0xAB};
  my_message[2] = {0xEE};
  ....
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

在 C 中,您可以按memcpy以下方式使用标准函数和复合文字

byte my_message[8];
if (myCondition == 0)
{
  memcpy( my_message, ( byte [] ){0x00, 0xAB, 0xEE, 0xFF, 0x00, 0x01, 0x0A, 0x0B}, 8 * sizeof( byte ));
}
else if (myCondition == 1)
{
  memcpy( my_message, ( byte[] ){0x11, 0xA1, 0xBC, 0x71, 0x00, 0x02, 0x94, 0x10}, 8 * sizeof( byte ) );
}
Run Code Online (Sandbox Code Playgroud)

在 C++ 中,最好使用std::array原始数组来代替。例如

std::array<byte, 8>  my_message;
if (myCondition == 0)
{
  my_message = {0x00, 0xAB, 0xEE, 0xFF, 0x00, 0x01, 0x0A, 0x0B};
}
else if (myCondition == 1)
{
  my_message = {0x11, 0xA1, 0xBC, 0x71, 0x00, 0x02, 0x94, 0x10};
}
Run Code Online (Sandbox Code Playgroud)

或者,如果要使用原始数组,那么如果编译器支持 C++ 20,那么您可以按以下方式使用基于范围的 for 循环

byte my_message[8];

if (myCondition == 0)
{
  for ( auto *p = my_message; auto item : {0x00, 0xAB, 0xEE, 0xFF, 0x00, 0x01, 0x0A, 0x0B} )
  {
      *p++ = item;
  }
}
else if (myCondition == 1)
{
  for ( auto *p = my_message; auto item : {0x11, 0xA1, 0xBC, 0x71, 0x00, 0x02, 0x94, 0x10} )
  {
      *p++ = item;
  }
}
Run Code Online (Sandbox Code Playgroud)

否则,如果编译器不支持 C++ 20,则此声明

auto *p = my_message;
Run Code Online (Sandbox Code Playgroud)

必须移出基于 for 循环的范围。