如何使用Structure成员动态分配成员数组?

时间:2012-05-30 20:51:49

标签: c arduino

这就是我想要做的事情:

//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中保存的值进行初始化。

问题在于:

  1. Steps不是常量整数。
  2. Steps不是静态的。
  3. 无论如何,我可以使用在数组之前初始化的成员动态地为数组分配内存吗?

2 个答案:

答案 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。