0

这是我想要做的:

//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}};

该行将导致 intArray Seq的大小为[7][1]( NUMSERVOS == 6)

我想Array Seq[][]Steps.

问题是:

  1. Steps不是一个常数整数。
  2. Steps不是静态的。

无论如何我可以使用在数组之前初始化的成员为数组动态分配内存吗?

4

2 回答 2

3

Arduino 是一个资源有限的小型平台。一般来说,在嵌入式系统中使用动态分配是一个坏主意,在一点点 8 位上使用它是一个非常糟糕的主意。动态内存的问题太多了:它需要一个堆,这是 8 位用户买不起的奢侈品,它会给你带来碎片和内存泄漏的问题,而且它非常非常慢。

你应该做的是分析程序的输入并确定最坏的情况,然后静态分配足够的内存来覆盖最坏的情况。

于 2012-05-30T21:24:09.010 回答
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}};

现在,如果您仍然想从那里获取 Steps,您仍然可以在您的结构中以这种方式创建一个 getter:

int Steps() const
{
    return n;
}

C解

实际上,如果您按照使用 C99 或 C11 编译器提供的方式编译代码,由于对可变长度数组的支持,它可能会起作用。不过,我不能确保 VLA 在结构中被接受。

于 2012-05-30T20:57:27.090 回答