我想我失去了整个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
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
...
unsigned char ICODES[NR_OF_CODES][CODE_LENGTH];
ICODES[RADIO_ONOFF] = { 9,180,88,11,33,4,0,255,64,191 }; // same as above
...
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 );
...
}
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!
答案 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