这就是我想要做的事情:
//Define a structure to store multistep sequences.
struct Command
{
int Steps; //Number of steps in the seq
int StepCount; //must be set to -1
int Seq[Steps][NUMSERVOS + 1];
};
例如,Command
初始化可能如下所示:
Command Home = {1,-1,{90, 90, 90, 90, 90, 90, 1000}};
这一行会导致int Array Seq
的大小为[7][1]
(NUMSERVOS == 6
)
我希望Array Seq[][]
使用Steps
中保存的值进行初始化。
问题在于:
Steps
不是常量整数。 Steps
不是静态的。无论如何,我可以使用在数组之前初始化的成员动态地为数组分配内存吗?
答案 0 :(得分:3)
Arduino是一个资源有限的小平台。一般来说,在嵌入式系统中使用动态分配是一个坏主意,并且在一点点苦味中使用它是一个非常糟糕的主意。动态内存存在太多问题:它需要一个堆,这是一个8位苦涩无法承受的奢侈品,它会给你带来碎片和内存泄漏的问题,而且速度非常慢。
你应该做的是分析程序的输入并确定最坏情况,然后静态分配足够的内存以覆盖最坏的情况。
答案 1 :(得分:1)
警告:最初是使用C ++标记发布的。模板解决方案无法使用普通的旧C语言。
您可以考虑以这种方式使用模板:
//Define a structure to store multistep sequences.
template<int n>
struct Command
{
// n = Number of steps in the seq
int StepCount; //must be set to -1
int Seq[n][NUMSERVOS + 1];
};
我假设您希望此值在您创建命令时非常有用,因为您尝试使用静态数组。然后,您将能够以这种方式实例化您的结构:
Command<1> Home = {-1, {90, 90, 90, 90, 90, 90, 1000}};
现在,如果您仍想从那里获取步骤,您仍然可以在您的结构中创建一个getter:
int Steps() const
{
return n;
}
C解决方案
实际上,如果您按照C99或C11编译器的方式编译代码,由于支持可变长度数组,它可能会起作用。我不能确保在结构中接受VLA。