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

この行はArray Seq、サイズ[7][1]( NUMSERVOS == 6)を持つ int になります。

Array Seq[][]に保持されている値で を初期化したいSteps

問題はそれです:

  1. Steps定数整数ではありません。
  2. Steps静的ではありません。

とにかく、配列の前に初期化されたメンバーを使用して配列にメモリを動的に割り当てることができますか?

4

2 に答える 2

3

Arduino は、リソースが限られた小さなプラットフォームです。一般に、組み込みシステムで動的割り当てを使用することは悪い考えであり、少し 8-bitter で使用することは非常に悪い考えです。動的メモリには非常に多くの問題があります。ヒープが必要であり、これは贅沢な 8-bitters では余裕がありません。断片化とメモリ リークの問題が発生し、非常に遅いです。

すべきことは、プログラムの入力を分析して最悪のシナリオを判断し、最悪のケースをカバーするために十分なメモリを静的に割り当てることです。

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

ここで、まだそこからステップを取得したい場合は、構造内でその方法でゲッターを作成できます。

int Steps() const
{
    return n;
}

C ソリューション

実際、C99 または C11 コンパイラで指定したとおりにコードをコンパイルすると、可変長配列サポートのおかげで動作する場合があります。ただし、構造で VLA が受け入れられることを保証することはできません。

于 2012-05-30T20:57:27.090 に答える