1

したがって、ソース ファイルには次の関数があります。

void update(state* old_state, state* measurement, uint32_t size)
{
  state new_state[size];
  //some function using measurement and old_state and returning the result in newstate

  arm_fadd_32(measurement,old_state,newstate,size);

// コードの残りの部分 }

これで、コンパイラは error#28:expression に定数値が必要であることを示すエラーをスローします。メソッド内でサイズのローカル変数が変更されていなくても、サイズの定義中にコンパイラが定数を期待しているという事実が原因だと思います。私は次のことを試しました:

int const a = size; 

その後、再初期化しようとしましたが、定数値が不明であると言われています。私はインターネットでいくつかの調査を行いましたが、組み込みアプリケーションのコードを使用しているため、malloc を使用せずに簡単な方法はないようです。

実際に malloc を使用せずにこの問題を回避する方法はありますか? よろしくお願いします!

4

4 に答える 4

4

いいえ、そうではありません。コンパイラが可変長配列を許可しない場合は、コンパイル時の定数が必要であることを意味します。

VLA は C99 でサポートされていますが、これはおそらくあなたが使用しているものではありません。

int const a定数変数を宣言しますが (笑)、コンパイル時の定数ではありません。を使用する必要がありますmalloc

于 2012-10-02T21:34:32.663 に答える
4

1990 年の ISO C 標準では、配列のサイズは定数整数式でなければなりません。ではなく、「定数」に注意してくださいconst。定数式とは、(大まかに) コンパイル時に値がわかっている式です。const、同じ語根に由来しますが、実際には「読み取り専用」を意味します。

1999 年の標準では、VLA (可変長配列) が追加されました。これにより、コードが合法になります。VLA の欠点の 1 つは、必要なスペースの割り当ての失敗を検出するメカニズムがないことです。割り当てが失敗した場合、プログラムの動作は未定義です。(運が良ければ落ちるかもしれません。)

最近のほとんどの C コンパイラは、C99 標準のほとんどをサポートしています。有効にするには、コマンドライン オプションが必要になる場合があります。一方、Microsoft の C コンパイラは C90 のみをサポートし、さらに C99 固有の機能はほとんどサポートされておらず、Microsoft はそれを変更する予定はないと述べています。使用しているコンパイラをお知らせいただければ、より役立つ可能性があります。

を使用malloc()して、動的にサイズ変更された配列をヒープに割り当てることができます。

state *new_state = malloc(size * sizeof *new_state);
if (new_state == NULL) {
    // allocation failed, handle the error somehow
}

これmalloc()は、コンパイラが VLA をサポートしている場合でも、VLA よりも有利です。

于 2012-10-02T21:36:01.903 に答える
2

あなたの C コンパイラは明らかに C99 VLA をサポートしていません。つまり、配列にはコンパイル時に既知の次元が必要です。そして、あなたのものはそうではありません。

明らかに、を使用してヒープに割り当てることができますmalloc。しかし、パフォーマンス上の理由から、それをしたくないと述べています。実行時にサイズが決定されるスタック割り当てメモリが本当に必要な場合は、を使用する必要がありますalloca

alloca危険をはらんでいることに注意してください。allocaスタック オーバーフローは、C99 VLA を使用するときと同様に、 を使用するときに常に存在する危険です。

于 2012-10-02T21:37:11.940 に答える
1

C89 では、配列サイズは定数でなければなりません。const修飾子は、オブジェクトが定数であることを修飾するのではなく、読み取り専用であることを修飾します。

C99 では、一定でない配列サイズを持つことができ、これらの配列は可変長配列 (VLA) と呼ばれます。

于 2012-10-02T21:35:24.263 に答える