2

アルゴリズム用の小さなCコードを書いています。主なターゲットは組み込みマイクロコントローラーですが、テスト目的では、Matlab/Pythonインターフェイスが必要です。

私は、C90の使用を要求する組み込みプログラミング標準(MISRA-C 2004)に従っておりmalloc、友人の使用を思いとどまらせています。したがって、コード内のすべての配列には、コンパイル時にメモリが割り当てられます。入力配列のサイズを変更する場合は、コードを再コンパイルする必要があります。これは、マイクロコントローラーのシナリオでは問題ありません。ただし、Matlab / Pythonを使用してプロトタイピングする場合、入力配列のサイズはかなり頻繁に変更され、毎回再コンパイルすることはオプションのようには思えません。この場合、C99の使用は許容され、配列のサイズは実行時に決定する必要があります。

問題は、コードをクリーンに保ちながら、これら2つのシナリオを同じコードで共存させるためにCでどのようなオプションがありますか?

私の主な関心事は、コードを保守しやすくする方法であることを強調する必要があります。#ifdefを使用して、静的に割り当てられた配列または動的に割り当てられた配列を取得することを検討しました。しかし、配列が多すぎるので、#ifdefを使用するとコードが見苦しく見えると思います。

4

2 に答える 2

3

たった 1 つで済む方法を考えました#ifdef。個人的には、必要に応じて弾丸をかじってコードを再コンパイルします。本番用とテスト用に異なる C 方言を使用するという考えは、私を少し緊張させます。

とにかく、ここにあなたができることがあります。

#ifdef EMBEDDED
#define ARRAY_SIZE(V,S) (S)
#else
#define ARRAY_SIZE(V,S) (V)
#endif

int myFunc(int n)
{
    int myArray[ARRAY_SIZE(n, 6)];
    // work with myArray
}

組み込み環境にない場合、マクロは変数 を選択ARRAY_SIZEします。または組み込み環境の場合Vは固定サイズ。S

于 2012-05-09T14:23:02.267 に答える
1

MISRA-C:2004はC99を禁止しているためVLAを禁止しているため、厳密に準拠したMISRAコードを記述している場合は、それらを使用できません。また、VLAは今後のMISRA-C規格で明示的に禁止される可能性が非常に高いです。

サイズが不明な静的に割り当てられた配列を使用しないオプションはありますか?あれは:

uint8_t arr[] = { ... };  
... 
n = sizeof(arr)/sizeof(uint8_t);

これはおそらく「最も美しい」方法です。または、VLAを使用してC99でデバッグビルドを行い、リリースビルドで静的に割り当てられたアレイに変更することもできます。

于 2012-05-09T14:10:11.747 に答える