c ++中的二维数组/初始化数据(Arduino)

时间:2013-11-10 10:37:18

标签: c++ arrays initialization arduino

我想我失去了整个C ++知识......

我想要的是以适当(可读)的方式初始化2D unsigned char数组: 我的方法:

#define RADIO_ONOFF 0
#define RADIO_P1 1
#define RADIO_P2 2
... 

#define NR_OF_CODES = 5
#define CODE_LENGTH = 10

#1:

unsigned char** codes = new unsigned char*[NR_OF_CODES];
codes[RADIO_ONOFF] = new unsigned char[CODE_LENGTH]{ 9,180,88,11,33,4,0,255,64,191 }; //     does not work
...

#2:

unsigned char ICODES[NR_OF_CODES][CODE_LENGTH];
ICODES[RADIO_ONOFF] = { 9,180,88,11,33,4,0,255,64,191 };  // same as above
...

#3:

class Test {
  private:
    unsigned char data[CODE_LENGTH];

  public:
    Test(unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4, unsigned char a5, unsigned char a6, unsigned char a7, unsigned char a8, unsigned char a9, unsigned char a10);

    unsigned char* getData(void);
};

Test::Test(unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4, unsigned char a5, unsigned char a6, unsigned char a7, unsigned char a8, unsigned char a9, unsigned char a10) {
  this->data[0] = a1;
  this->data[1] = a2;
  this->data[2] = a3;
  this->data[3] = a4;
  this->data[4] = a5;
  this->data[5] = a6;
  this->data[6] = a7;
  this->data[7] = a8;
  this->data[8] = a9;
  this->data[9] = a10;
}

unsigned char* Test::getData(void) {
  return data;
}

void setup() {

  test[RADIO_ONOFF] = new Test( 9,180,88,11,33,4,0,255,64,191 );
  test[RADIO_P1] = new Test( 9,180,88,11,33,4,0,255,64,192 );
  ...
}

#4

const unsigned char RADIO_ONOFF[]  = { 9,180,88,11,33,4,0,255,64,191 };
const unsigned char RADIO_P1[]     = { 9,180,88,11,33,4,0,255,64,192 };
...

我得到#1和#2的错误消息:(代码应该为Arduino编译,它需要一个setup-function)

在函数'void setup()'中: revTest:58:错误:在'{'标记之前预期的primary-expression revTest:58:错误:预期`;'在'{'令牌

之前

好的 - 我的问题:

对我来说 - #3和#4很好看且可读。 #3的努力是最高的 - 但我认为是 如果我想要最快的方法在switch语句中使用数组。 - 是吗?

我认为#1和#2中的数组初始化应该这样工作????

非常 Arduino 具体:

我不确定在setup()内部必须定义什么,以及什么应该在setup()之外。静态初始化和全局外部,动态内部还是什么?

我对Arduino的PROGMEM很感兴趣 - 我认为在这种情况下不值得努力。我是对的? (我想我将有大约50种不同的代码......)

THX!

2 个答案:

答案 0 :(得分:2)

在回答您的问题之前,让我们看一下解决方案1和2出了什么问题。

解决方案1和解决方案2的问题在于您正在使用初始化程序(即`{}语法),您的编译器需要一个赋值表达式。

初始化语法只能在声明变量的位置使用。粗略地说,初始化应该被理解为一旦构造变量就给变量赋值。赋值应理解为给已经在其他地方构造的变量赋值。

所以当你这样做时:

unsigned char** codes = new unsigned char*[NR_OF_CODES];

您正在进行初始化。您正在将变量codes初始化为新分配的unsigned char指针数组。

在下一行,您将告诉编译器您正在进行分配。您正在使用=符号并分配给前一行声明的codes - 编译器将其视为赋值。

codes[RADIO_ONOFF] = new unsigned char[CODE_LENGTH] ... 

然后,紧接着,您尝试使用初始化语法。

你的编译器抱怨,因为它读了这个:

codes[RADIO_ONOFF] = new unsigned char[CODE_LENGTH] ... 

作为一个完整的表达。它会在您分配CODE_LENGTH字节数组并将其分配给RADIO_ONOFF的{​​{1}}成员时读取。

它希望你停在那里,使用半结肠,但你继续并添加了初始化语法codes。它不明白,因为你将赋值和初始化混合在一起 - 这是两个不同的东西。这就是为什么你从编译器得到“我期望一个半冒号”类型的错误。

为了回答您的问题,解决方案3和解决方案4都需要很长时间。有更快的方法在C ++中初始化2D数组。我也同意以前关于使用{}的答案。

这样的事情会更合适吗?

uint8_t

读取数组语法的一个好方法是将方括号uint8_t codes[CODE_LENGTH][NR_OF_CODES] = {{0, 1, 2, 3, 4, 5, 6, 7}, {0, 1, 2, 3, 4, 5, 6, 7}, {0, 1, 2, 3, 4, 5, 6, 7}, {0, 1, 2, 3, 4, 5, 6, 7} }; 中的最后(最右边)值作为某个数组的大小,然后向后工作。

因此[]将解码为某事的大小为uint8_t codes[CODE_LENGTH][NR_OF_CODES]的数组。为了得到某些东西,我们会看到NR_OF_CODES - 所以它是uint8_t codes[CODE_LENGTH]数组的长度为NR_OF_CODES的数组,每个数组的长度为{{1} }}

我希望有所帮助。

NB。在回答你关于需要使用命名索引索引数组的评论时 - 没有什么能阻止你通过索引引用uint8_t的各个成员。 你可以做的是通过{0}初始化整个事物 - 将所有成员初始化为0的简写。

您可以单独分配CODE_LENGTH数组(或任何数组)的成员,例如。

codes

试试这个例子 - 并注意输出:

RADIO_ONOFF

答案 1 :(得分:0)

首先,由于这是标记的C ++,我要说没有必要做#define。您现在可以访问执行相同操作的静态const变量,但它们是类型安全的。

以下是Google C ++风格指南对支撑列表的评价:

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Braced_Initializer_Lists

当我不使用已经设置的样式的项目时,我通常会遵循本指南。另外,我应该提到风格是非常主观的,所以你最终可能得到广泛的答案。

另外,不要使用char,只需要存储字节数据。这就是uint8_t的用途。

另外,请参阅此SO线程以获取有关如何初始化数组的所有选项:How to initialize all members of an array to the same value?在大多数情况下,因为它们只是保持不变的常量,所以可以使它们成为静态const。

像这样:

static const size_t kMyCodeArraySize = 14;  // an example
static const uint8_t[kMyCodeArraySize] = {1, 2, 3, 4};  // example intialization