(由于大多数Arduino板上可用的内存有限,我有时会遇到使用有效C/c++代码的问题,所以这个问题是专门关于在Arduino上使用结构体的任何问题。)
我已经看到了在Arduino中使用结构体的示例代码,但没有讨论内存要求。
- 结构体的大小只是其字段的数据类型的总和吗? 在程序中存储结构是一个选项吗?是否存在访问速度问题?
- 结构体的字段是可写的(例如下面的
s1.LED1.state = 0;
)(当然,如果存储在program中则不是)。 - 我可以定义一个结构的字段作为另一个(不同类型)结构吗?
- 是否有可能通过使用
for..in
或索引来迭代结构?
我的用例是我有64个由MAX7219芯片驱动的led。由于物理布线布局的要求,使用结构体以更合乎逻辑的方式组织LED顺序将很方便,从而使编程更容易/更连贯。
typedef struct {
byte row : 6;
byte col : 128;
byte state : 1;
} LED;
typedef struct {
LED LED1 : {1,1,1};
LED LED2 : {1,2,1};
LED LED3 : {1,4,1};
LED LED4 : {1,8,1};
LED LED5 : {1,16,1};
LED LED6 : {1,32,1};
LED LED7 : {1,64,1};
LED LED8 : {1,128,1};
} LED_SECTION;
LED_SECTION s1;
s1.LED1.row = 1;
s1.LED1.state = 0;
- 当使用分号语法时,结构体的大小将是其所有字段的总和。
-
我认为可以使用以下语法:(http://www.arduino.cc/en/Reference/PROGMEM)
LED leds PROGMEM;
-
是的,语法是你在问题中写的。
-
是的,你可以:
typepedef struct {struct otherStruct;
}; -
是的,你可以使用蒙版。例如:
for (int i = 0, byte cur = s1 & 1; ; i < numOfFieldsInStruct; i++, cur = (s1<<i)&1) { .... }
关于你对这个答案的最后评论,让我提出以下解决方案:
以一种寻址不会占用内存的方式组织LED(就像在问题中- LED结构体需要内存进行寻址)。相反,您可以使用它们在数组和结构体中的位置来定位led,如下所示:
typedef struct {
byte LED1 : 1;
byte LED2 : 1;
byte LED3 : 1;
byte LED4 : 1;
byte LED5 : 1;
byte LED6 : 1;
byte LED7 : 1;
byte LED8 : 1;
} LED_ROW;
LED_ROW leds[256];
leds[0].LED1 = 1; // turn led at row 0, col 0 to 1
leds[0].LED5 = 1; // turn led at row 4, col 0 to 1
led[100].LED3 = 1; // turn led at row 2, col 100 to 1
...
// and so on
你可以考虑用不同的方式排列数组,在结构体中有256个项目,在数组中有8个项目,这样行将被[]和点后面的颜色引用,像这样:
leds[0].LED3 = 1; // turn on led at row 0, col 2 to 1